我们有一个传统的 C++ COM DLL,它在 IDL 中定义了一个结构。
IDL 的简化版本包含:
typedef struct
{
int num;
} LegacyStruct;
interface ILegacyInterface : IUnknown
{
HRESULT GetStruct( [in,out] LegacyStruct* pVal );
}
我们现在需要定义一个实现 ILGacyInterface 的 .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# 程序集类。
编译时,显示以下警告:
Type library exporter warning processing 'CSClass.GetStruct(pVal)'。警告:非 COM 可见值类型“LegacyStruct”被当前导出的类型或其基类型之一引用。
由于 LegacyStruct 是非 COM 可见的,因此生成的程序集的 .tlb 没有公开 GetStruct() 方法(即,当使用 oleview 查看时)。
显然 C++ COM 客户端无法编译:
错误 C2039: 'GetStruct' : is not a member of 'CSClass'
有没有办法确保在旧版 C++ COM DLL 中定义的 LegacyStruct 在 C# COM 可见 .Net 程序集的方法中使用时正确公开?