我想创建一个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 Framework提供具有Dllimport属性的PInvoke功能,以允许托管应用程序调用非托管 函数打包在DLL中。 - 它有速度,稳定性和技能等问题。
Microsoft Excel SDK。 - 但我在各种论坛上都看到,这是一项繁琐且容易出错的任务,需要专业的技能和经验。
我们可以使用尽可能少的第三方附加框架/工具包:
i)XLW(http://xlw.sourceforge.net/),它是标准的开源C / C ++包装器。
ii)XLL +工具包隐藏了环境的复杂性,并允许程序员和设计师专注于他们的核心技能。
iii)对于托管代码,或者为了从.NET UDF调用非托管C ++代码的C#包装器,我们可以使用Excel-DNA(http://exceldna.codeplex.com)。
如果我对这些方法中的任何一种方法都不对,请纠正我,并建议我可以使用哪种方法。
答案 0 :(得分:1)
使用P / Invoke,您可以在C#中创建包含本机dll的类。
一个提示 - 在你的本机dll中实现extern“C”{...}中的函数而不是类,以避免输出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。
答案 1 :(得分:0)
如果您不使用.NET,我建议您不要在C ++代码中添加C#包装器。目前尚不清楚你从增加的复杂性中获得了什么。
如果你能够支付解决方案的费用,我建议你首先考虑一下Planatech XLL+ toolkit - 它是完善的,功能齐全,并且非常重视你正在做的事情。
否则,如果您对Excel C SDK有一定的了解并且对现代C ++风格感到满意,请查看Keith Lewis's xll add-in library。他有很多例子,并且已经实现了各种高级功能,所有功能都在自由许可下使用源代码。
最后,您提到的XLW可能是制作C ++ Excel加载项的标准开源选项。