当我尝试使用ComSourceInterfaces的字符串参数而不是typeof时,我无法将程序集注册为COM对象

时间:2017-07-06 20:46:41

标签: c# com com-interop

当我尝试使用ComSourceInterfaces的字符串参数而不是typeof时,我无法将程序集注册为COM对象。我正在实现多个接口,因为这是SDK所要求的。

当我使用

[ComVisible(true),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces("IAccessControl"),
Guid("738CFFEF-37DC-4C61-957E-C5A78FE20223")]
public class EventGeneratorV2  : IAccessControl

我收到错误

  

错误MSB3217:无法注册程序集“... \ Event Generator v2.dll”。无法从程序集“事件”加载“IAccessControl”类型   Generator v2,Version = 1.1.0.0,Culture = neutral,   公钥= bffdb712704a75b7' 。

但是,如果我将代码更改为

[ComVisible(true),
ClassInterface(ClassInterfaceType.None),
ComSourceInterfaces(typeof(IAccessControl)),
Guid("738CFFEF-37DC-4C61-957E-C5A78FE20223")]
public class EventGeneratorV2  : IAccessControl

它确实可以正常工作。我还尝试了IAccessControl接口的完全限定名称,Lib.Interfaces.IAcccessControl作为字符串,但它仍然失败。最好的解决方案是使用多个ComSourceInterfaces但你只能使用一次,使用typeof最多需要4个接口。我需要实现9个接口,以便与其他软件兼容。有没有办法让字符串起作用?

1 个答案:

答案 0 :(得分:0)

好吧我明白了。该字符串实际上是" Lib.Interfaces.IAcccessControl,Lib"对于每个接口。第一部分是接口的完全限定名称,而lib是接口来自的参考。

然后当我添加其他接口时,我必须在每个接口之间添加\ 0。所以我最后的ComSourceInterfaces是相当冗长的

ComSourceInterfaces("Lib.Interfaces.IAccessControl, Lib\0Lib.Interfaces.IAccessControl2, Lib\0Lib.Interfaces.ITranslate, Lib\0Lib.Interfaces.ITranslate2, Lib\0Lib.Interfaces.IComConfig, Lib\0Lib.Interfaces.IComConfig2, Lib\0Lib.Interfaces.IInput, Lib\0Lib.Interfaces.IInput2, Lib\0Lib.Interfaces.IAsset, Lib\0Lib.Interfaces.IAsset2, Lib\0Lib.Interfaces.IFakeName, Lib\0Lib.Interfaces.IComManager, Lib\0Lib.Interfaces.IDistributeEvent, Lib")

之后,DLL会正确编译和注册。