C# COM互操作,创建.net COM并在.net中使用

C# COM互操作,创建.net COM并在.net中使用,c#,.net,interop,C#,.net,Interop,我有一个公开com接口的程序集: [ComVisible(true)] [Guid("C92A5F13-088F-4776-A967-42A60EFAFC29")] public interface ITestInterface { byte[] AddItem(string label, byte[] array); } 和执行: [ComVisible(true)] [Guid("C35C9235-3377-44A7-AC9E-7FCC24EF71D

我有一个公开com接口的程序集:

  [ComVisible(true)]
  [Guid("C92A5F13-088F-4776-A967-42A60EFAFC29")]  
  public interface ITestInterface
  {
    byte[] AddItem(string label, byte[] array);
  }
和执行:

  [ComVisible(true)]
  [Guid("C35C9235-3377-44A7-AC9E-7FCC24EF71D0")]    
  public class Test : ITestInterface
  {
    public byte[] AddItem(string label, byte[] array)
    {
      return null;//irrelevant
    }
  }
该com在程序集的清单中发布

现在在客户端(.net)中,我有一个接口:

  public interface ITestInterface
  {
    byte[] AddItem(string label, byte[] array);
  }
并尝试激活它:

Type adapter = Type.GetTypeFromProgID("Test.Test");                 
object adapterObj = Activator.CreateInstance(adapter);

ITestInterface myClassAdapter = (ITestInterface)adapterObj;
在最后一行,我得到一个异常:

System.InvalidCastException: 'Unable to cast object of type 'Test.Test' to type 'Test.ITest'.'

我的“客户端”界面有什么问题。我应该更改什么?

客户端程序集的
ITestInterface
与COM程序集的
ITestInterface
不同,尽管其名称相同。您必须在客户端程序集中添加对原始COM程序集的引用,并使用其接口。如果不将接口公开给其他语言,则将其作为COM对象可见没有任何好处。.NET类型标识不仅包括名称空间+类型标识符名称,还包括它来自的程序集。因此,客户端接口声明永远不会与服务器接口兼容,强制转换必须始终失败。in.NET 4.0+可以解决您的问题,但[Guid]必须相同。请注意,您实际上并不使用COM,CLR不容易被愚弄,因此它不是测试任何东西的合适方法。@martinstoeckli我在下面这篇文章中写道:唉,作者没有发布客户端接口…@HansPassant,为什么您的意思是我不使用COM?也许您只是想通过客户端程序集使用COM程序集?如果是这样,您只需转到客户端程序集中的“解决方案资源管理器”,导航到您的项目/引用并添加所需的程序集。COM接口不需要使用另一个.net程序集的类/接口。客户端程序集的
ITestInterface
与COM程序集的
ITestInterface
不同,尽管其名称相同。您必须在客户端程序集中添加对原始COM程序集的引用,并使用其接口。如果不将接口公开给其他语言,则将其作为COM对象可见没有任何好处。.NET类型标识不仅包括名称空间+类型标识符名称,还包括它来自的程序集。因此,客户端接口声明永远不会与服务器接口兼容,强制转换必须始终失败。in.NET 4.0+可以解决您的问题,但[Guid]必须相同。请注意,您实际上并不使用COM,CLR不容易被愚弄,因此它不是测试任何东西的合适方法。@martinstoeckli我在下面这篇文章中写道:唉,作者没有发布客户端接口…@HansPassant,为什么您的意思是我不使用COM?也许您只是想通过客户端程序集使用COM程序集?如果是这样,您只需转到客户端程序集中的“解决方案资源管理器”,导航到您的项目/引用并添加所需的程序集。COM接口不需要使用另一个.net程序集的类/接口。