gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:53:20 26 4
gpt4 key购买 nike

我想创建一个 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. 我们可以使用尽可能少的第三方附加框架/工具包:

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

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

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

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

最佳答案

使用 P/Invoke,您可以在 C# 中创建类来包装您的 native dll。

一个提示 - 在您的 native 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中找到.

关于c# - 如何在 C# 中编写调用 C++ DLL 导出函数的 excel 插件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17168063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com