C# 了解COM对象以及如何声明它们

C# 了解COM对象以及如何声明它们,c#,winapi,com,attributes,C#,Winapi,Com,Attributes,假设我要为创建接口 我在网上看到了一些示例,其中显示了以下定义: [ComImport] [Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IMMDeviceEnumerator { } 我的理解(可能):属性指定它来自dll。[Guid]属性是接口标识符 我不明白的是:这个GUID值是如何获得的?[Inte

假设我要为创建接口

我在网上看到了一些示例,其中显示了以下定义:

[ComImport]
[Guid("A95664D2-9614-4F35-A746-DE8DB63617E6")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMMDeviceEnumerator
{

}
我的理解(可能):属性指定它来自dll。
[Guid]
属性是接口标识符

我不明白的是:这个GUID值是如何获得的?
[InterfaceType]
属性的作用是什么?如何填写其余的函数


我想弄明白这件事,真是迷路了,所有的文档都是超级不透明的

您可以自己创建GUID。如果您不想自己分配一个发电机,则会有联机发电机

所有接口类型都应派生自
IUnknown

更新:这是一个发电机

它们使用相同的GUID,因为已使用该特定GUID定义了
IMMDeviceEnumerator
。如果创建自己的接口,则将创建自己的GUID

您从
IUnknown
派生,因为

在该约束范围内,自定义接口可以支持几乎任何方法或参数,包括异步方法。您还可以为自定义接口生成类型库,以便客户端可以在运行时访问有关对象方法的信息

这个GUID值是如何获得的

GUID作为COM接口定义的一部分创建;由于您试图调用其他人的对象,因此需要使用他们的GUID。你可以在要点中找到它

头文件Mmdeviceapi.h定义了Mmdeviceapi中的接口

通常的方法是添加对COM dll的引用,或者运行tlbimp.exe,这将为您生成一个COM类包装器,其中包含所有神奇的goo

但是,如果COM类型库不可用,那么您基本上必须自己通过查看IDL文件来完成

与p/invoke签名一样,这可能会让人非常痛苦——所以


对于COM互操作的更大问题,基本上需要学习一点COM并熟悉C。答案是肯定的,但通常如果您只是想使用一个众所周知的COM组件,最好使用一个“如果可以”的组件。

这是正确的。我的意思是,如果您正在创建自己的Guid,那么您将创建自己的Guid,。非常感谢你指引我去那个图书馆!对于似乎正在为现有接口寻找互操作代码的OP来说,这不太可能有帮助。
 MIDL_INTERFACE("A95664D2-9614-4F35-A746-DE8DB63617E6")
    IMMDeviceEnumerator : public IUnknown