C# 我可以在非托管代码中实现托管COM可见接口吗?

C# 我可以在非托管代码中实现托管COM可见接口吗?,c#,com-interop,C#,Com Interop,我有一个用C#实现的类,我想从本机应用程序中使用它。C#类有一个由接口描述的依赖关系,该依赖关系可能由实例化该类的代码交付。我希望在本机应用程序中实现此接口,并通过COM将其传递给C#对象。经过高度简化,C代码如下所示: [ComVisible(true)] [Guid(“910E8445-7A62-403F-BAEE-17AB0C169CA8”)] [接口类型(ComInterfaceType.InterfaceSiunknown)] 公共接口IComWidget { void SetClie

我有一个用C#实现的类,我想从本机应用程序中使用它。C#类有一个由接口描述的依赖关系,该依赖关系可能由实例化该类的代码交付。我希望在本机应用程序中实现此接口,并通过COM将其传递给C#对象。经过高度简化,C代码如下所示:

[ComVisible(true)]
[Guid(“910E8445-7A62-403F-BAEE-17AB0C169CA8”)]
[接口类型(ComInterfaceType.InterfaceSiunknown)]
公共接口IComWidget
{
void SetClient(IComWidgetClient);
void DoStuff();
}
[ComVisible(true)]
[Guid(“850F3EBB-CD18-4E16-881F-50B50DD5AEB0”)]
[接口类型(ComInterfaceType.InterfaceSiunknown)]
公共接口IComWidgetClient
{
int GetValue();
}
[ComVisible(true)]
[Guid(“86B9EC33-6CDF-438F-9A67-57D009723027”)]
[ClassInterface(ClassInterfaceType.None)]
公共类ComWidget:IComWidget
{
私有IComWidgetClient m_客户端;
公共空间
{
var i=m_Client.GetValue();
WriteLine(“值为{0}”,i);
}
public void SetClient(IComWidgetClient)
{
m_Client=客户;
}
}
本机应用程序将COM库作为带有适当清单的并行程序集加载,并实现
IComWidgetClient
接口。这似乎是可行的,但在系统上运行自动测试时,有几个测试会失败,并出现未经处理的ExecutionEngineeExecAction。它失败的方式(测试过程被中止)闻起来像是垃圾收集过程中的某种损坏。 我想我可以编写一个托管的C++单元测试,它模仿导致错误的步骤。至少它以同样的方式失败。测试如下所示:

其中,
NativeClient
是实现IComWidgetClient的简单本机对象

出了什么问题?我想做的一切可能吗

完整的源代码可以在这里找到:

[TestMethod]
void TestStuff()
{
   IComWidgetPtr sut = NULL;
   NativeClient* client = NULL;

   try
   {
      sut = IComWidgetPtr(__uuidof(ComWidget));
      client = new NativeClient();

      IComWidgetClient* pvObject;
      client->QueryInterface(IID_IComWidgetClient, (void**)&pvObject);

      sut->SetClient(pvObject);

      sut->Release();

      GC::Collect();
      GC::WaitForPendingFinalizers();

      Assert::IsTrue(true); // If we get this far, everything went OK...
   }
   finally
   {
      sut = NULL;
      delete client;
      client = NULL;
   }
};
public class NativeClient: IComWidgetClient
{
   ...
}