gpt4 book ai didi

c# - 如何使用 IDispatch 从非托管 C++ 调用 C# dll?

转载 作者:行者123 更新时间:2023-11-30 03:12:09 31 4
gpt4 key购买 nike

我有一个需要从非托管 C++ 调用的 C# dll。我遇到的主要问题是我的 C++ 代码对应于一个 excel 加载项,可以为 excel 2003 和 excel 2007 安装,当我在 excel 2007 中安装我的加载项时,我尝试调用我的 C# dll,它工作得很好,但由于某种原因我仍然无法找到,在 excel 2003 中它崩溃了,excel 向我显示运行时错误消息,并且在调试我的 c++ 代码时我可以看到代码在尝试时失败创建我的 C# dll 的一个实例,它说即使我用 regasm 注册了该类也没有注册。

这是我的 C# 代码:


namespace ManagedDLL
{
[
Guid("3C80EE60-D9B8-4daf-89BE-6C7B748F613C"),
InterfaceType( ComInterfaceType.InterfaceIsDual),
ComVisible(true)
]
public interface ICalculator
{
[DispId(1)]
int main(string args, IntPtr _handle);
};


[
Guid("5134F342-5B7F-4db2-94F0-F450610419CF"),
ProgId("myapp.CCOMEntryPoint"),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(ICalculator)),
ComVisible(true)
]
public class COMEntryPoint : ICalculator
{
public int main(string args, IntPtr _handle)
{
string[] _args = args.Split(new char[] { ':' });

Program.handle = _handle;
return Program.Main(_args);
}
}
}

在 C++ 中,我所做的是导入使用 regasm 注册我的 C# dll 时生成的 .tlb 文件,如下所示:


\#import "..\bin\release\ManagedDLL.tlb" raw_interfaces_only
using namespace ManagedDLL;
.
.
.
int callMyDll()
{
long handle = 0, result = 0;
BSTR args;

HRESULT hr = CoInitialize(NULL);

ICalculatorPtr pICalc(__uuidof(COMEntryPoint));

pICalc->main(bstrStr, handle, &result);

return result;
}

但正如我之前提到的,这段代码不适用于 excel 2003,所以我的问题是:

  1. 我在声明 C# dll 的方式上做错了什么导致我在 excel 2003 中出现问题?
  2. 就像现在一样,我的 C# dll 可以被视为 ActiveX 对象吗?
  3. 如何从 C++ 以另一种方式调用我的 C# dll?例如使用 IDIspatch

谢谢

最佳答案

我以前遇到过类似的问题。我不是从 C++ 调用 C#,但概念是一样的。

我必须通过 COM 将 .NET dll 加载到主机应用程序中,这看起来就像您正在尝试做的那样。问题是主机应用程序(在您的例子中是 excel)正在加载 .NET runtime 1.1。我们的 dll 是为 .NET 2.0 编译的。

可能是 Excel 2003 加载了 1.1 运行时,而 2007 加载了更新的版本。看看这个论坛: Excel selects wrong .NET runtime .

您也可以使用 MSBee 进行测试以 1.1 运行时为目标,然后尝试在 Excel 2003 中加载您的 dll。

关于c# - 如何使用 IDispatch 从非托管 C++ 调用 C# dll?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1473520/

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