我必須更新一些舊應用程序(vb6),並且我一直使用COM interop在c#(Visual Studio 2010)中編寫新代碼。它的大部分工作正常,但我遇到了一個問題,我不知道是什麼導致它。BinaryFormatter Deserialisation在通過COM interop使用時拋出異常
我用下面的方法來出於某種原因執行對象
public static T CloneObject<T>(T source)
{
T destination = default(T);
if (!typeof(T).IsSerializable)
{
throw new ArgumentException("The type must be serialisable.", "source");
}
if (Object.ReferenceEquals(source, null))
{
return default(T);
}
using (Stream ms = new MemoryStream())
{
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, source);
ms.Position = 0;
destination = (T)formatter.Deserialize(ms);
}
return destination;
}
的深層副本誤碼出來的時候,反序列化函數被調用。它引發的異常是找不到代碼所在的程序集。
無法找到程序集「AssemblyBeingUsed,版本= 1.0.0.0,文化=中立,公鑰=空」
這是稍微有一些混亂我爲集已被訪問及其說它無法找到。格式化錯誤消息的代碼是同一個程序集的一部分!
以下是異常的堆棧跟蹤。
在System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() 在System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo集信息,字符串名稱) 在System.Runtime。 Serialization.Formatters.Binary.ObjectMap..ctor(String objectName,String [] memberNames,BinaryTypeEnum [] binaryTypeEnumA,Object [] typeInformationA,Int32 [] memberAssemIds,ObjectReader objectReader,Int32 objectId,BinaryAssemblyInfo assemblyInfo,SizedArray assemIdToAssemblyTable) at System。 Runtime.Serialization.Formatters.Binary .__ BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record) at System.Runtime.Serialization.Formatters.Binary .__ BinaryParser。 ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum) at System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run() at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler,__BinaryParser serParser,Boolean fCheck,Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 在System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流serializationStream,HeaderHandler處理器,布爾FCHECK,布爾isCrossAppDomain,IMethodCallMessage methodCallMessage)
編輯:更多有用的信息。
此功能從不直接從vb6調用。因爲它使用泛型,我敢肯定,這是不可能的。該函數是從vb6應用程序加載的表單中調用的。當從c#應用程序使用這個表單時,即使它執行完全相同的操作也沒有問題。
Visual Studio項目使用「Register for COM interop」選項,程序集作爲參考加載到vb6項目中。
編輯:從fuslogvw.exe
輸出的輸出從fuslogvw.exe示出了具有我感興趣的(BarcodeAndOperatorDatabase)的組件相關聯5名的條目。由於它們合併時間相當長,我已將所有輸出上傳到 this file。
說實話,我不知道我在看什麼。有3個操作,我認爲當程序集綁定發生時對應於:
15:29:06:VB6應用程序啓動,操作成功。 (2條目):從程序集加載的表單(我認爲),操作失敗。這是令人困惑的表單加載正確,並可以交互。
15:29:50(2個條目):當調用CloneObject方法時操作失敗的按鈕單擊失敗。
一個狂野的鏡頭,但你有多個目錄中的dll?如果你有這樣的暮光區行爲時,可以發現exe的2個相同的DLL副本。 –
它看起來像解析一個整數有問題。輸入是否有空值?嘗試int?而不是int。整數是否有小數位(句點或逗號)? +/-和數字之間有空格嗎? VB在處理不同的數字格式方面稍微好一些。 – jdweng
顯然不使用GAC,我聞到Assembly.LoadFile()鼠。 –