如何用c#编写调用c++ DLL导出函数的excel插件

How to write excel plugin in C# that calls C++ DLL exported function

本文关键字:函数 插件 excel DLL c++ 何用 调用      更新时间:2023-10-16

我想创建一个excel插件。我有一些c++ DLL,可以导出在各种类中定义的一些函数。我想在创建excel插件时使用这些函数。

为此,我试图创建一个演示插件,简单地计算简单的利息。

这是下面的c++ DLL源文件。

//SimpleInterest.CPP
#include <iostream>
using namespace std;
#include "CalSimpleInterest.h"
namespace simpleInt
{
    // total interest 
    double calculateInterest:: CalSimplInterest(double Principal, double Rate, double Time)
    {
        double interest = 0.0;
        interest = (Principal * Time * Rate) / 100;
        return interest;
    }
}

相似头文件

//CalSimpleInterest.h
namespace simpleInt
{
    class calculateInterest
    {
        public:
        static __declspec(dllexport) double CalSimplInterest(double Principal, double Rate, double Time);
    };
}

我已经编译并创建了CalSimpleInterest.dll。现在我想使用c#/c++中的CalSimplInterest()函数来创建一个excel插件。

我还搜索了各种备选方案来编写excel插件。

我发现有很多方法可以做到这一点。

  1. 制作一个c#包装器,从。net udf中调用非托管的c++代码。- .NET框架提供了带有Dllimport属性的PInvoke特性,允许托管应用程序调用非托管应用程序包在dll中的函数。

  2. Microsoft Excel SDK。-但我在各种论坛上看到,这是一项繁琐且容易出错的任务,需要专门的技能和经验。

  3. 我们可以使用尽可能少的第三方附加框架/工具包:

i) XLW (http://xlw.sourceforge.net/)是一个标准的开源C/c++包装器。

XLL+工具包隐藏了环境的复杂性,允许程序员和设计人员专注于他们的核心技能。对于托管代码,或者制作一个c#包装器,从。net udf中调用非托管c++代码,我们可以使用Excel-DNA (http://exceldna.codeplex.com)。

如果我对这些方法有任何错误,请纠正我,并建议我可以使用哪一种方法。

使用p/Invoke,你可以在c#中创建一个类来包装你的本地dll。

一个提示-在您的本机dll中实现extern "C"{…}而不是class,以避免在输出dll中出现名称混淆。

本地:

extern "C"
{
    static __declspec(dllexport) double CalSimplInterest(double Principal, double Rate, double Time)
    {
        double interest = 0.0;
        interest = (Principal * Time * Rate) / 100;
        return interest;
    }
}
c#:

using System.Runtime.InteropServices;
class DllWrapper
{
    [DllImport("CalSimpleInterest.dll")]
    public static extern double CalSimplInterest(double Principal, double Rate, double Time);
}

详细信息请访问http://msdn.microsoft.com/en-us/library/aa288468%28v=vs.71%29.aspx。

如果您不使用。net,我不建议您在c++代码中添加c#包装器。不清楚您是否从增加的复杂性中获得了什么。

如果你有能力支付解决方案,我建议你首先考虑Planatech XLL+工具包-它是完善的,功能齐全,高度重视做的正是你想做的。

否则,如果你对Excel C SDK有一些熟悉,并且你对现代c++风格感到舒服,可以看看Keith Lewis的xll插件库。他有很多例子,并实现了各种高级功能,所有这些都是在自由许可下的源代码。

最后,你提到的XLW可能是制作c++ Excel外接程序的标准开源选项。