【发布时间】:2017-10-07 19:36:02
【问题描述】:
我正在使用 COM 互操作从 C++ 应用程序调用 C# dll 中的方法。
C#代码是:
namespace MyLibrary
{
[ComVisible(true)]
[Guid("f08942b1-db20-44aa-9713-7d28fff51e2b")]
public interface IMyLibraryInterface
{
string POSRequest(string request);
}
[ComVisible(true)]
[Guid("4d962dd5-05ed-431b-82e2-378aebe8d0dc")]
public class MyLibraryInterface : IMyLibraryInterface
{
public string myRequest(string request)
{
....
return response;
}
}
}
调用C++代码是:
CoInitialize(NULL);
MyLibrary::IMyLibraryInterfacePtr MyLibraryInterface(__uuidof(MyLibrary::MyLibraryInterface));
myResult = (LPCTSTR) MyLibraryInterface->myRequest(myInput);
CoUninitialize();
相关 tlb 文件的导入位置:
#import "MyLibrary.tlb"
这在我的开发机器上调试和运行发布版本时都有效,但是当我从另一台机器上运行它时会导致应用程序崩溃。具体来说,创建指针的行似乎是问题所在:
MyLibrary::IMyLibraryInterfacePtr MyLibraryInterface(__uuidof(MyLibrary::MyLibraryInterface));
似乎另一台机器上可能缺少某些东西,但我不知道是什么?
【问题讨论】:
-
你在另一台机器上注册了 C# COM dll 吗?您必须使用
regasm.exe来注册dll。 -
您必须注册 COM 才能使用它,这也是尽可能避免使用它的一个很好的理由 :)。
-
如果您不想先注册 COM,可以使用 免注册 COM 模型进行 xcopy 部署。 msdn.microsoft.com/en-us/library/ms973913.aspx
-
@MickyD - 这是一个好点,我忘记了这一点,我在一些部署中使用了无注册 COM。我很高兴我已经好几年没和 COM 打交道了。
-
@tj_ush - 如果您将不得不使用使用 COM 的遗留代码库,请尝试查找 Don Box's "Essential COM" 的副本。当我开始进行 COM 编程时,我发现它非常有用。
标签: c# c++ visual-studio mfc com