c++ 中的 C# COM 互操作
C# COM INTEROP in c++
我正在尝试从 C++ 客户端调用我的 C# dll,到目前为止,我已经完成了所有设置并在我的注册表中(例如,我可以从 power shell 创建和调用它)。
我遇到的问题是我无法从我的 C++ 代码中调用它。
我的 C# 界面:
namespace MyInterop
{
[Guid("BE507380-1997-4BC0-AF01-EE5D3D537E6B"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyDotNetInterface
{
void ShowCOMDialog();
}
}
我的实现接口的C#class:
namespace MyInterop
{
[Guid("38939B1E-461C-4825-80BB-725DC7A88836"), ClassInterface(ClassInterfaceType.None)]
public class MyDotNetClass : IMyDotNetInterface
{
public MyDotNetClass()
{ }
public void ShowCOMDialog()
{
MessageBox.Show("I am a" +
" Managed DotNET C# COM Object Dialog");
}
}
}
非常简单,因为我现在正在测试。我现在将 tlb 导入我的 C++ 文件
#import "<Path to file>\MyInterop.tlb" raw_interfaces_only
最后我试着调用它:
HRESULT hr = CoInitialize(NULL);
MyInterop::IMyDotNetInterfacePtr MyDotNetClass(__uuidof(MyInterop::MyDotNetClass));
MyDotNetClass->ShowCOMDialog();
CoUninitialize();
但是,VS 告诉我 ShowCOMDialog 不是我的界面的成员。我错过了什么吗?
通过声明 raw_interfaces_only
,您已经抑制了包装函数的生成,如 this link. And since your interface is based on IDispatch
, you are forced to call your interface methods indirectly via IDispatch's Invoke
中所示。
建议:
- 将接口类型更改为
ComInterfaceType.InterfaceIsDual
或 ComInterfaceType.InterfaceIsIUnknown
- 删除
raw_interfaces_only
以便使用生成的包装函数。
我正在尝试从 C++ 客户端调用我的 C# dll,到目前为止,我已经完成了所有设置并在我的注册表中(例如,我可以从 power shell 创建和调用它)。
我遇到的问题是我无法从我的 C++ 代码中调用它。
我的 C# 界面:
namespace MyInterop
{
[Guid("BE507380-1997-4BC0-AF01-EE5D3D537E6B"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IMyDotNetInterface
{
void ShowCOMDialog();
}
}
我的实现接口的C#class:
namespace MyInterop
{
[Guid("38939B1E-461C-4825-80BB-725DC7A88836"), ClassInterface(ClassInterfaceType.None)]
public class MyDotNetClass : IMyDotNetInterface
{
public MyDotNetClass()
{ }
public void ShowCOMDialog()
{
MessageBox.Show("I am a" +
" Managed DotNET C# COM Object Dialog");
}
}
}
非常简单,因为我现在正在测试。我现在将 tlb 导入我的 C++ 文件
#import "<Path to file>\MyInterop.tlb" raw_interfaces_only
最后我试着调用它:
HRESULT hr = CoInitialize(NULL);
MyInterop::IMyDotNetInterfacePtr MyDotNetClass(__uuidof(MyInterop::MyDotNetClass));
MyDotNetClass->ShowCOMDialog();
CoUninitialize();
但是,VS 告诉我 ShowCOMDialog 不是我的界面的成员。我错过了什么吗?
通过声明 raw_interfaces_only
,您已经抑制了包装函数的生成,如 this link. And since your interface is based on IDispatch
, you are forced to call your interface methods indirectly via IDispatch's Invoke
中所示。
建议:
- 将接口类型更改为
ComInterfaceType.InterfaceIsDual
或ComInterfaceType.InterfaceIsIUnknown
- 删除
raw_interfaces_only
以便使用生成的包装函数。