2011-05-11 21 views
8

我們有一個COM註冊的舊C/C++ .dll。我們的客戶擁有使用該.dll的本地和.NET客戶端。在客戶端使用與.NET版本相同的.NET版本替換COM註冊的.dll時,.NET客戶端崩潰

我們已經構建了一個新的.NET .dll來替換舊的,即它們的COM接口是相同的。我們希望替換舊的.dll而無需我們的客戶重新編譯或向客戶做任何事情。

對於本地客戶端,它可以正常工作,只需註銷舊的.dll並註冊新的(帶有regasm)即可。它也適用於某些.NET客戶端。但是,在這些情況下,客戶端和新的.dll都使用相同的.NET版本進行編譯,它會引發下面的異常。

換句話說,這個作品:

.dll is .NET 3.5 -> client is .NET 4.0 
.dll is .NET 4.0 -> client is .NET 3.5 
.dll is any .NET -> Client is native 

這引發以下exeption:

.dll is .NET 4.0 -> client is .NET 4.0 
.dll is .NET 3.5 -> client is .NET 3.5 

[A] BARAPIXLib.barcom5不能轉換爲[B] BARAPIXLib.barcom5。

類型A來源於位於C:\ arkiv \ S_BTW \ BTW \ BARAPIXWebService \ Barapix \ bin \ BARAPIXLib的上下文「LoadFrom」中的'BARAPIXLib,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。 DLL」。

類型B來源於位於'C:\ arkiv \ Bartrack \ BartrackTest \ x86 \ Src \ BartrackTest \ bin'上下文'Default'中的'BartrackTest,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null' \ 86 \發佈\ BartrackTest.exe」。「}

任何想法,將不勝感激。

+0

任何機會我們可以看到DLL方法引用的聲明以及一些調用代碼? – pickypg

+0

你的意思是客戶怎麼稱呼我們的.dll?這是我們所不知道的,但他們可能會在Visual Studio中完成「添加引用」。我們希望用新的.NET代替舊的C/C++ COM .dll,而不需要重新編譯客戶端或任何東西。如果這是可能的。 – Poppert

回答

1

嘗試取消註冊任何以前的版本,並檢查該DLL是在同一個文件夾中的可執行文件。也可以嘗試尋找在你從哪裏加載的DLL我認爲你正在加載它manualy所以看看你所引用的錯誤的DLL地址

+0

感謝您的回覆!我們取消了註冊舊的C/C++ .dll,用新的.NET替換了這個文件(使用相同的文件名並在同一目錄中),並使用regasm進行註冊。但客戶仍然無法工作(無需重新編譯等)。它基本上說不能將SomeTypeA轉換爲SomeTypeAClass(「類」以某種方式附加到類型名稱後面)。 – Poppert

1

這可能是因爲在使用相同版本的.net框架的情況下,返回給客戶端的實例不再是一個COM包裝器,而是一個純淨的.Net對象,因此當您試圖將其轉換爲COM接口失敗。 還有一個類似的問題here。解決方案涉及使用Primary Interop Assembly

+0

感謝您的回覆! 我們的客戶已經對我們的舊C/C++ COM.dll做了「添加引用」,因此客戶端.exe使用的客戶端目錄中有一個「Interop.blablabla.dll」。 我們是否可以強制客戶的客戶使用新的主Interop程序集而不是他們已經使用的程序集(而不需要重新編譯客戶端等)? – Poppert

+0

@Ppertpert我很擔心這是不可能的。據我所知,PIA可能會有不同的類型名稱。無論哪種方式,在這個主題上專門發佈一個新的SO問題可能是一個好主意,你可能會得到一些有創意的解決方案。 – yms