如何用c#编写调用c++ DLL导出函数的excel插件
How to write excel plugin in C# that calls C++ DLL exported function
我想创建一个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插件。
我发现有很多方法可以做到这一点。
制作一个c#包装器,从。net udf中调用非托管的c++代码。- .NET框架提供了带有Dllimport属性的PInvoke特性,允许托管应用程序调用非托管应用程序包在dll中的函数。
Microsoft Excel SDK。-但我在各种论坛上看到,这是一项繁琐且容易出错的任务,需要专门的技能和经验。
我们可以使用尽可能少的第三方附加框架/工具包:
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外接程序的标准开源选项。
- 节点插件 API 将数组作为函数参数传递
- 插件:TypeError:addons.function() 不是一个函数
- V8 - 节点C++插件 - 在构造函数中引发异常会导致"致命错误:v8::ToLocalChecked Em
- 从不同的节点插件方法多次调用JS函数
- 插件中的 UActorComponent 派生类不会对函数调用做出反应
- 从C 插件中调用QML中的JS函数
- Node.js插件类成员函数
- 如何存储对函数的引用,以便稍后可以在节点.js C++插件模块中回调它
- 来自(QT)插件的调用函数失败
- 从多线程C++插件回调NodeJS Javascript函数
- Cpp 中的插件 - 执行外部程序函数
- 为什么我的动态加载的Qt插件类没有调用析构函数?
- 是否有任何标准的Visual Studio 2008插件可用于跟踪/记录C++项目的构造函数和析构函数调用
- 使用nodejs javascript或c++插件覆盖本机nodejs函数
- c.vim c/c++ 插件将函数的返回值放在函数上方,没关系
- XLL插件开发-Excel SDK函数问题
- 如何用c#编写调用c++ DLL导出函数的excel插件
- 创建Qt插件和使用非虚拟函数
- 节点.js本机插件 - 包装类的析构函数不运行
- 通过函数导出检查c++插件版本