C# 向COM公开类似索引器的属性

C# 向COM公开类似索引器的属性,c#,com-interop,idl,C#,Com Interop,Idl,我已经在现有的COM接口。我不想创建一个.net程序集,该程序集使用新的GUID将新接口公开为COM,但接口的结构需要相同 如何创建公开此接口的.net类C [ odl, uuid(1ED4C594-DDD7-402F-90DE-7F85D65560C4), hidden, oleautomation ] interface _IFlashPhase : IUnknown { [propget] HRESULT _stdcall ComponentName(

我已经在现有的COM接口。我不想创建一个.net程序集,该程序集使用新的GUID将新接口公开为COM,但接口的结构需要相同

如何创建公开此接口的.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);

};

您的IDL无效,具有[oleautomation]属性的接口应派生自IDispatch,而不是IUnknown。我将给出正确的声明,并提示您需要在哪里修改它们以获得您的声明

不能在C中声明索引属性,C团队拒绝实现它们。版本4支持在COM类型库中声明的索引属性,但仍然不允许自己声明它们。解决方法是使用VB.NET语言,对此毫无疑问。将VB.NET类库项目添加到解决方案中。让它看起来像这样:

导入System.Runtime.InteropServices 名称空间含糊不清 _ _ _ 公共接口示例 _ 属性IndexerByVal索引作为整数作为整数 _ 属性SomePropertyByVal索引作为整数作为字符串 端接口 结束命名空间 注意,dispid 0的使用是特殊的,它是接口的默认属性。这对应于C语言中的索引器

VB.NET所需要的只是声明,您仍然可以用C语言编写接口的实现。项目+添加引用,项目选项卡并选择VB.NET项目。让它看起来像这样:

使用制度; 使用System.Runtime.InteropServices; 名称空间含糊不清{ [ComVisibletrue] [指南8B72CE6C-511F-456e-B71B-ED3B3A09A03C] [ClassInterface ClassInterfaceType.None] 公共类实现:ClassLibrary2.Mumble.IExample{ 公共整型get_索引器整型索引{ 收益指数; } 公共无效集\索引器int索引,int值{ } 公共字符串get_SomePropertyint索引{ returnindex.ToString; } public void set\u SomePropertyint索引,字符串值{ } } } 您需要在VB.NET和C程序集上运行Tlbexp.exe来生成类型库。带有实现的C语言包括VB.NET语言

要获取从IUnknown而不是IDispatch派生的接口,请编辑接口声明。删除DispId属性并使用ComInterfaceType.InterfaceInknown