2015-10-07 21 views
0

我在C#中定義了一個接口,它將在C#中實現,但是從非託管C++模塊調用爲COM對象。如何將C#接口的方法參數公開爲特定的COM/ODL類型?

我知道我想要/需要的C++ API的樣子,我怎麼會通過ODL定義它:

//args is an array of BSTR e.g VT_ARRAY|VT_BSTR 
HRESULT DoMethod(/*[in]*/BSTR name, /*[in]*/VARIANT args); 

我不知道如何在C#中設置這引起TLB定義以匹配這個,關於VARIANT。 它可能是如下簡單的東西?

void DoMethod(string name, string args[]) 

我一直在四處尋找COM/.NET互操作文檔,但任我已經錯過了這一部分,或者乾脆不明白就是BEING描述的內容!

順便說一句,我怎麼能看到正在發出什麼COM定義爲給定的C#接口? DLL/TLB是否易於檢查? (爲什麼?)

回答

1

如果你想在C++側的變種,那麼你需要聲明它:

using System.Runtime.InteropServices; 

namespace LibraryName { 
    [ComVisible(true)] 
    [InterfaceType(ComInterfaceType.InterfaceIsDual)] 
    public interface IFoo { 
     void DoMethod(string name, object args); 
    } 
} 

與Regasm.exe /代碼庫/ TLB註冊C#組件。/tlb選項生成類型庫,您可以在C++代碼中使用#import指令。它有足夠的空間來查看,它生成的LibraryName.tlh文件具有聲明。或者,您可以從Visual Studio命令提示符運行Oleview.exe並使用文件>查看Typelib來查看它。

你原來的本能選擇是更好的,string []在C++端顯示爲SAFEARRAY *。這種方式減少事故。

+0

所以反對<--> VARIANT,我發現這個文件要求之後,但我不確定我仍然會如何創建將被編組爲右型變種的這個對象?你可能會添加一個(僞)實現的'DoMethod()'?就變種V而言,safearray--我們最初的僅C++項目總是以這種方式完成它,而不是通過裸安全陣列。我無法告訴你爲什麼,它已經快20歲了! –

+0

呃,不知道要求如何能是有意義的,它是有創建陣列,它的東西,在一個變體的調用者。 DoMethod()使用它。 –

+0

是的,你說得對。雖然如果它是一個輸出參數,我仍然對同樣的基本問題感興趣,但這不是我現在需要的...感謝您發現此問題。 –

相關問題