我們有一個傳統的C++ COM DLL,它在IDL中定義了一個結構。
簡化的IDL的版本包含:C#COM可見.Net程序集與傳統C++ COM DLL的結構
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客戶端不編譯:
錯誤C2039:「GetStruct」:不是成員「CSClass」
有一種方法,以確保LegacyStruct,其在傳統的C++中定義當在C#COM可見的.Net程序集的方法中使用時,COM DLL是否正確顯示?
你應該真的使用C++/CLI包裝類來與COM通信。 – Indy9000
你可以發佈該結構的非簡化IDL嗎? – tcarvin
該結構的非簡化版本也非常簡單,以及... typedef struct {long {0} {long { 長msecs; 長區域; } LegacyStruct; – alexg