Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何用C编写调用C+的excel插件+;DLL导出函数_C#_C++_Excel_Plugins_Dll - Fatal编程技术网

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

C# 如何用C编写调用C+的excel插件+;DLL导出函数,c#,c++,excel,plugins,dll,C#,C++,Excel,Plugins,Dll,我想创建一个excel插件。 我有一些C++ DLL,它导出了在各个类中定义的函数。 我想在创建excel插件时使用这些函数 为此,我试图创建一个演示插件,simly计算简单的兴趣 这是C++的DLL源文件。 //SimpleInterest.CPP #include <iostream> using namespace std; #include "CalSimpleInterest.h" namespace simpleInt { // total interest

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

为此,我试图创建一个演示插件,simly计算简单的兴趣

这是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.dll。 现在,我想使用C#/C++中的CalSimplInterest()函数创建一个excel插件

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

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

< L> > P>创建一个C .xr包装器,它调用.NETUDFS中的非托管C++代码。 -NET Framework提供了带有Dllimport属性的PInvoke功能,允许托管应用程序调用非托管应用程序 DLL中打包的函数。 -它有速度、稳定性和技能等问题

  • 微软Excel SDK。 -但我在各种论坛上读到,这是一项乏味且容易出错的任务,需要专业技能和经验

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

  • i) XLW()是一个标准的开源C/C++包装器

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

    对于托管代码,或者使一个从.NET UDFs调用C++的非托管C++代码的包装器,我们可以使用Excel DNA()。
    如果我对这些方法中的任何一种有错误,请纠正我,并建议我可以使用其中的哪种方法。

    使用p/Invoke,您可以在C中创建一个类,该类将包装您的本机dll

    一个技巧-在本机dll中,在外部“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#:


    更多详细信息可以在中找到。

    使用p/Invoke,您可以在C#中创建一个类,该类封装您的本地dll

    一个技巧-在本机dll中,在外部“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#:


    <> >更多细节可以在.< /p> 中找到。如果您不使用.NET,否则,我不建议您将C++封装器添加到C++代码中。不清楚您是否从增加的复杂性中获益

    如果你能支付一个解决方案,我建议你首先考虑-它是建立良好的,充分的特点和高度重视做你正试图做的事情。

    否则,如果您熟悉Excel C SDK,您对现代C++风格感到满意,请看。他有很多例子,并实现了各种高级功能,所有的源代码都是在自由许可下实现的


    <>最后,你提到的是可能的C++开源Excel插件的标准开源选项。

    如果你不使用.NET,否则,我不建议你将C++的包装器添加到C++代码中。不清楚您是否从增加的复杂性中获益

    如果你能支付一个解决方案,我建议你首先考虑-它是建立良好的,充分的特点和高度重视做你正试图做的事情。

    否则,如果您熟悉Excel C SDK,您对现代C++风格感到满意,请看。他有很多例子,并实现了各种高级功能,所有的源代码都是在自由许可下实现的


    <>最后,你提到的可能是C++ C++ Excel插件的标准开源选项。< /P>在Internet上搜索C++或CLI或P/INVINKE(平台调用)。在Internet上搜索C++/CLI或P/INVINKE(平台调用)。但是我的本机代码不是C风格。它们是C++ DLL中的类方法。所以,如何使用P/Invoke在C#中创建类,该类为此类本机dll打包。但我的本机代码不是C风格。它们是C++ DLL中的类方法。所以,如何使用P/Invoke在C#中创建类,该类为此类本机dll封装。
    using System.Runtime.InteropServices;
    
    class DllWrapper
    {
        [DllImport("CalSimpleInterest.dll")]
        public static extern double CalSimplInterest(double Principal, double Rate, double Time);
    }