Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用C#中没有固定CLSID的COM接口_C#_Com Interop - Fatal编程技术网

使用C#中没有固定CLSID的COM接口

使用C#中没有固定CLSID的COM接口,c#,com-interop,C#,Com Interop,我使用的是第三方库,它公开了一个COM接口(总是相同的)。然而,不管出于什么原因,他们决定用每个新版本更改CLSID。我可以在注册表中找到CLSID,甚至可以从ProgID中找到,但我需要从C#中使用它 我基本上可以声明相同的IFooV1、IFooV2等,它们具有不同的GUID,并在它们之间进行手动调度。但是,我想知道,在确定GUID的版本后,是否可以在运行时设置该GUID以避免代码重复。如何获取实现该接口的对象实例?或者您正在实现接口?您不需要使用[Guid]注释接口副本,因为您没有导出接口。

我使用的是第三方库,它公开了一个COM接口(总是相同的)。然而,不管出于什么原因,他们决定用每个新版本更改CLSID。我可以在注册表中找到CLSID,甚至可以从ProgID中找到,但我需要从C#中使用它


我基本上可以声明相同的IFooV1、IFooV2等,它们具有不同的GUID,并在它们之间进行手动调度。但是,我想知道,在确定GUID的版本后,是否可以在运行时设置该GUID以避免代码重复。

如何获取实现该接口的对象实例?或者您正在实现接口?您不需要使用
[Guid]
注释接口副本,因为您没有导出接口。@Dai,ComImport是机制的一部分,.NET Framework使用COM接口作为.NET对象。在这种情况下,GUID是需要知道映射到哪个接口的。对,但是如何实例化或获取接口的对象?@Dai,获取实例的方法并不重要,最终使用.NET Framework获得System.\uu ComObject,我将其转换为问题中定义的必要接口。NET Framework针对这种情况有一个特殊的强制转换实现,它执行binding.IID,而不是CLSID。创建新版本的程序员需要更改guid,这一点非常重要。在COM中获得版本不匹配比在.NET中要糟糕得多。在.NET中,您通常会得到TypeLoadException或MissingMethodException,这并不是什么好消息,但在COM中,损坏要严重得多。只有在幸运的情况下才会出现AccessViolationException。如果接口支持IDispatch,就必须放弃使用它,在C#中使用dynamic关键字。准备好面对痛苦。不要这样做是唯一体面的建议。
[ComImport, Guid("THAT-CHANGES")]
interface IFoo {
  void Bar();
}