【发布时间】:2012-06-30 04:33:19
【问题描述】:
我们有一个传统的 C++ COM DLL,它在 IDL 中定义了一个结构。
IDL 的简化版本包含:
typedef struct
{
int num;
} LegacyStruct;
interface ILegacyInterface : IUnknown
{
HRESULT GetStruct( [in,out] LegacyStruct* pVal );
}
我们现在需要定义一个实现ILegacyInterface 的.Net C# COM 可见程序集。
在 C# 项目中,我们添加对旧版 COM DLL 的引用并定义一个实现此接口的类:
[ComVisible( true )]
public class CSClass : ILegacyInterface
{
public void GetStruct( ref LegacyStruct pVal )
{
....
}
}
我们的目标是在 C++ COM 客户端程序中使用这个暴露于 COM 的 C# 程序集类。该程序应该能够使用旧版 COM DLL 和实现 ILegacyInterface 的新 C# 程序集类。
编译时显示以下警告:
类型库导出器警告处理'CSClass.GetStruct(pVal)'。警告:非 COM 可见值类型“LegacyStruct”被当前导出的类型或其基类型之一引用。
由于 LegacyStruct 对 COM 不可见,因此生成的程序集的 .tlb 没有公开 GetStruct() 方法(即,当使用 oleview 查看时)。
显然 C++ COM 客户端无法编译:
error C2039: 'GetStruct' : is not a member of 'CSClass'
有没有办法确保在旧版 C++ COM DLL 中定义的 LegacyStruct 在用于 C# COM 可见 .Net 程序集的方法时正确公开?
【问题讨论】:
-
你真的应该使用 C++/CLI 包装类来与 COM 通信。
-
您能发布该结构的非简化 IDL 吗?
-
结构的非简化版本也很简单... typedef struct { long days;长毫秒;长区; } LegacyStruct;
-
该结构没有与之关联的 uuid,但我尝试了使用和不使用 uuid。结果是一样的,可惜……
-
请发布 LegacyStruct 的 C# 声明
标签: .net com interop com-interop