【发布时间】:2023-03-24 20:16:01
【问题描述】:
我有一个需要从非托管 C++ 调用的 C# dll。我遇到的主要问题是我的 c++ 代码对应于一个 excel 加载项,当我在 excel 2007 中安装我的加载项并尝试调用我的 C# dll 时,可以为 excel 2003 和 excel 2007 安装它,它工作得很好,但由于某种原因我仍然无法找到,在 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,所以我的问题是:
- 我在声明 C# dll 的方式上做错了什么,导致我在 excel 2003 中出现问题?
- 就像现在一样,我的 C# dll 是否可以被视为 ActiveX 对象?
- 如何从 c++ 以另一种方式调用我的 C# dll?例如使用 IDIspatch
谢谢
【问题讨论】: