C# 如何从非托管C++;使用IDispatch? 我有一个C++的DLL,我需要从非托管C++调用。我的主要问题是我的C++代码对应于一个Excel插件,当我在Excel 2007中安装我的外接程序时,可以安装Excel 2003和Excel 2007,我尝试调用我的C语言,它工作得很好,但是由于某种原因,我仍然没有找到,在Excel 2003中崩溃,Excel显示运行时错误信息,当调试我的C++代码时,我可以看到代码在试图创建我的C语言的DLL实例时失败,它说即使我注册了RigASM,该类也没有注册。
这是我的C#代码: 在C++中,我做的是导入当我使用ReGASM登记我的C ydll DLL时生成的.tLB文件,像这样:C# 如何从非托管C++;使用IDispatch? 我有一个C++的DLL,我需要从非托管C++调用。我的主要问题是我的C++代码对应于一个Excel插件,当我在Excel 2007中安装我的外接程序时,可以安装Excel 2003和Excel 2007,我尝试调用我的C语言,它工作得很好,但是由于某种原因,我仍然没有找到,在Excel 2003中崩溃,Excel显示运行时错误信息,当调试我的C++代码时,我可以看到代码在试图创建我的C语言的DLL实例时失败,它说即使我注册了RigASM,该类也没有注册。,c#,c++,excel,com,dll,C#,C++,Excel,Com,Dll,这是我的C#代码: 在C++中,我做的是导入当我使用ReGASM登记我的C ydll DLL时生成的.tLB文件,像这样: \#import "..\bin\release\ManagedDLL.tlb" raw_interfaces_only using namespace ManagedDLL; . . . int callMyDll() { long handle = 0, result = 0; BSTR args; HRESULT hr = CoInitia
\#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++调用Cype,但是这个概念是相同的。p> 我必须通过COM将.NET dll加载到主机应用程序中,这看起来就像您正在尝试做的。问题是主机应用程序(在您的示例中是excel)正在加载.NET运行时1.1。我们的dll是为.NET2.0编译的 可能是Excel 2003正在加载1.1运行时,而2007加载的是更新的版本。请在以下位置查看此论坛:
你也可以通过使用1.1个运行时来测试这个,然后尝试在Excel 2003中加载你的DLL。< /P> < P>我不是C++程序员,所以我不能评论这一部分,而是从C边回答:
“我在做错事 我声明我的C#dll的方式是 是否在excel 2003中给我带来问题?” 不,您的属性用法看起来完全正确。干得好 “就像现在一样,我的C#dll可以 是否认为是ActiveX对象?” 通过使用您显示的属性进行编译,然后通过RegAsm注册,您已经创建并正确地向COM公开了您想要的程序集。(术语“ActiveX”通常用于引用COM控件,而您的类不是控件。) “我如何在另一个系统中调用我的C#dll C++的方式? 榜样。” 您正在使用[InterfaceType(ComInterfaceType.InterfaceIsDual)]
属性,这意味着该接口通过IDispatch同时暴露于早期绑定和后期绑定
简而言之,我不知道这里出了什么问题,所以我会尝试dequadin的想法来检查正在加载的.NET Framework版本是否位于或高于正在构建的框架
如果不是这样的话,我能想到的另一件事是,在没有可恢复错误的情况下,直接发生崩溃,这向我表明,注册接口与编译调用方的接口之间可能存在某种不一致。发生这种情况的原因是,如果您更改接口,GUID不会更改--您已经通过属性显式设置了GUID--因此,如果接口发生更改,而所有内容都没有从下到上重新构建和注册,那么所有的麻烦都会爆发。因此,如果您以任何方式更改了接口,那么您需要重新构建C++组件,重新登记RigASM,然后重新编译C++引用,即引用它。
这只是我最好的猜测。并且,如果您对每个问题使用相同的精确程序集,则不会解释Excel 2003与2007的问题。简言之,很难知道出了什么问题,因为您的C#代码看起来100%干净
--Mike是的,问题正是你所怀疑的,excel正在加载1.1运行时,所以你在那篇文章中建议的修复方法工作得很好,或者还有另一篇文章讨论了同样的问题,可能会对某些人有所帮助。
\#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;
}