向 COM 公开类似索引器的属性
我有现有的 COM 接口。我不想创建一个将新接口公开为 COM(具有新 GUID)的 .net 程序集,但接口的结构需要相同。
如何创建公开此接口的 .net 类 (C#)?
[
odl,
uuid(1ED4C594-DDD7-402F-90DE-7F85D65560C4),
hidden,
oleautomation
]
interface _IFlashPhase : IUnknown {
[propget]
HRESULT _stdcall ComponentName(
[in] short i,
[out, retval] BSTR* pVal);
[propput]
HRESULT _stdcall ComponentName(
[in] short i,
[in] BSTR pVal);
[propget]
HRESULT _stdcall ComponentMolePercent(
[in] short i,
[out, retval] double* pVal);
[propput]
HRESULT _stdcall ComponentMolePercent(
[in] short i,
[in] double pVal);
[propget]
HRESULT _stdcall ComponentFugacity(
[in] short i,
[out, retval] double* pVal);
[propput]
HRESULT _stdcall ComponentFugacity(
[in] short i,
[in] double pVal);
};
I have in existing COM-interface. I wan't to create a .net assembly that exposes a new interface as COM (with a new GUID), but the structure of the interface needs to be the same.
How can i create a .net class (C#) that exposes this interface?
[
odl,
uuid(1ED4C594-DDD7-402F-90DE-7F85D65560C4),
hidden,
oleautomation
]
interface _IFlashPhase : IUnknown {
[propget]
HRESULT _stdcall ComponentName(
[in] short i,
[out, retval] BSTR* pVal);
[propput]
HRESULT _stdcall ComponentName(
[in] short i,
[in] BSTR pVal);
[propget]
HRESULT _stdcall ComponentMolePercent(
[in] short i,
[out, retval] double* pVal);
[propput]
HRESULT _stdcall ComponentMolePercent(
[in] short i,
[in] double pVal);
[propget]
HRESULT _stdcall ComponentFugacity(
[in] short i,
[out, retval] double* pVal);
[propput]
HRESULT _stdcall ComponentFugacity(
[in] short i,
[in] double pVal);
};
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的 IDL 无效,具有
[oleautomation]
属性的接口应派生自 IDispatch,而不是 IUnknown。我将给出正确的声明并提示您需要修改它们才能获得您的声明。您不能在 C# 中声明索引属性,C# 团队拒绝实现它们。版本 4 支持在 COM 类型库中声明的索引属性,但仍然不允许您自己声明它们。解决方法是使用 VB.NET 语言,对此没有任何疑虑。将 VB.NET 类库项目添加到您的解决方案中。让它看起来类似这样:
注意
的使用,dispid 0很特殊,它是接口的默认属性。这对应于C#语言中的索引器。您所需要的只是 VB.NET 的声明,您仍然可以用 C# 语言编写接口的实现。项目 + 添加引用,项目选项卡并选择 VB.NET 项目。使其看起来与此类似:
您需要在 VB.NET 和 C# 程序集上运行 Tlbexp.exe 以生成类型库。带有实现的 C# 版本包括 VB.NET 版本。
要使接口从 IUnknown 而不是 IDispatch 派生,请编辑接口声明。删除 DispId 属性并使用
ComInterfaceType.InterfaceIsUnknown
。Your IDL isn't valid, an interface that is attributed with
[oleautomation]
should derive from IDispatch, not IUnknown. I'll give the proper declarations and hint where you need to modify them to get yours.You cannot declare indexed properties in C#, the C# team refuses to implement them. Version 4 has support for indexed properties that are declared in a COM type library but still doesn't allow declaring them yourself. The workaround is to use the VB.NET language, it has no qualms about it. Add a VB.NET class library project to your solution. Make it look similar to this:
Note the use of
<DispId>
, dispid 0 is special, it is the default property of an interface. This corresponds to the indexer in the C# language.All you need VB.NET for is the declaration, you can still write the implementation of the interface in the C# language. Project + Add Reference, Projects tab and select the VB.NET project. Make it look similar to this:
You need to run Tlbexp.exe on both the VB.NET and the C# assembly to generate the type libraries. The C# one with the implementation includes the VB.NET one.
To get the interface to derive from IUnknown instead of IDispatch, edit the interface declaration. Remove the DispId attributes and use
ComInterfaceType.InterfaceIsUnknown
.