簡體   English   中英

使用在C#中使用COM的DLL

[英]Using DLL that using COM in C#

我一直在C ++上編寫DLL,它將在C#中使用。 DLL有一些功能,我打電話給

hres =  CoInitializeEx(NULL, COINIT_MULTITHREADED); 

和下一個電話

hres =  CoInitializeSecurity(
        NULL, 
        -1,                          // COM authentication
        NULL,                        // Authentication services
        NULL,                        // Reserved
        RPC_C_AUTHN_LEVEL_PKT,   // Default authentication 
        RPC_C_IMP_LEVEL_IMPERSONATE, // Default Impersonation  
        NULL,                        // Authentication info
        EOAC_NONE,                   // Additional capabilities 
        NULL                         // Reserved
        );

沒有錯誤然后我試圖在C ++中使用這個DLL。 但是,如果我通過C#應用程序從DLL調用函數,我看到錯誤(80010106)設置后無法更改線程模式。 我變了

hres =  CoInitializeEx(NULL, COINIT_MULTITHREADED);

hres = CoInitialize(NULL);

CoInitializeSecurity之后出現此更改錯誤:

(80010119)    Security must be initialized before any
                          interfaces are marshalled or unmarshalled. It
                          cannot be changed once initialized.

怎么解決這個麻煩?

您可以從DLL中刪除對CoInitializeExCoInitializeSecurity的調用。 它們已經在線程上被調用 - 這就是你得到這些錯誤的原因。

但是,如果您的DLL嘗試將COM線程初始化為多線程單元,並且您的C#應用​​程序在單線程單元上調用DLL,那么您可能具有基本的不兼容性。 這取決於指定COINIT_MULTITHREADED的代碼行是否是故意選擇的原因,或者只是在最初編寫時似乎COINIT_MULTITHREADED東西。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM