如何在C#中编写excel插件,调用C ++ DLL导出函数

时间:2013-06-18 11:48:41

标签: c# c++ excel plugins dll

我想创建一个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 Framework提供具有Dllimport属性的PInvoke功能,以允许托管应用程序调用非托管      函数打包在DLL中。      - 它有速度,稳定性和技能等问题。

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

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

  4. i)XLW(http://xlw.sourceforge.net/),它是标准的开源C / C ++包装器。

    ii)XLL +工具包隐藏了环境的复杂性,并允许程序员和设计师专注于他们的核心技能。

    iii)对于托管代码,或者为了从.NET UDF调用非托管C ++代码的C#包装器,我们可以使用Excel-DNA(http://exceldna.codeplex.com)。

    如果我对这些方法中的任何一种方法都不对,请纠正我,并建议我可以使用哪种方法。

2 个答案:

答案 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加载项的标准开源选项。