[英]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中刪除對CoInitializeEx
和CoInitializeSecurity
的調用。 它們已經在線程上被調用 - 這就是你得到這些錯誤的原因。
但是,如果您的DLL嘗試將COM線程初始化為多線程單元,並且您的C#應用程序在單線程單元上調用DLL,那么您可能具有基本的不兼容性。 這取決於指定COINIT_MULTITHREADED
的代碼行是否是故意選擇的原因,或者只是在最初編寫時似乎COINIT_MULTITHREADED
東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.