2011-11-18 70 views
2

我開發了一個示例c#COM-Visible DLL。
內置x86並通過32位Regasm註冊,它可以通過COM Client很好地執行。
內置64位,並通過64位Regasm註冊,COM客戶端調用生成以下錯誤:問題爲COM Interop註冊x64程序集

Retrieving the COM class factory for component with CLSID {A0F2F58F-7B98-3605-BEC9-84724FF1E824} failed due to the following error: 80040154. 

我檢查並確保該CLSID是下HKCR \ CLSID註冊表確實存在。

下面是模擬通過C#中的COM訪問的例子:

var type = Type.GetTypeFromProgID("ProgID.Interop.5683"); 
var obj = Activator.CreateInstance(type); // <-- blows here 

我也通過將procmon檢查,有通過PROGID 問題是,哪裏是激活看完全是一個成功的訪問類型?以及如何使它「看到」我的x64註冊程序集?有什麼我需要添加的地方?

我發現許多「解決方案」建議x86重新構建。但是Come'on!我不打算這樣做,只是爲了COM而失去所有x64的好處。有沒有「真正的」解決方案?

+0

在什麼情況下會拋出80040154錯誤? –

+0

@Ramhound當CLSID不在或不在正確的位置時。所以我很困惑。 –

+2

您不會爲特定體系結構構建受管DLL,只有EXE項目的設置很重要。經典錯誤是使用Regasm.exe的錯誤位或忘記/ codebase選項。使用SysInternals的ProcMon實用程序進行故障排除。 –

回答

0

在經過了一夜的睡眠和一點事後,我發現需要從x64應用程序調用Activator來查找x64 CLSID,方法是在註冊表中查找x64位置。 即,當從x86應用程序調用時,Activaor將在註冊表中的x86位置查找CLSID和隨後的密鑰(包括代碼庫)。

var type = Type.GetTypeFromProgID("ProgID.Interop.5683"); 
var obj = Activator.CreateInstance(type); 
+1

這是因爲x86和x64 EXE/DLL(COM或其他)不會混合,就像使用類似的。 – user7116

+0

@sixlettervariables:是的,這是我在這裏與我的其他問題了解到的:http://stackoverflow.com/questions/8193857/calling-an-x64-assembly-via-com-from-a-32-bit-app/8194293#8194293 –

相關問題