Ich muss einige alte Anwendungen (vb6) aktualisieren und ich habe COM-Interop verwendet, um den neuen Code in C# (Visual Studio 2010) zu schreiben. Es hat meistens gut funktioniert, aber ich bin auf ein Problem gestoßen und ich bin mir nicht sicher, was es verursacht.BinaryFormatter Deserialisierung löst Ausnahme bei Verwendung durch COM-Interop
Ich verwende die folgende Methode eine tiefe Kopie eines Objekts
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;
}
die Codefehler Aus irgendeinem Grund durchzuführen, wenn die Deserialize Funktion aufgerufen wird. Die Ausnahme, die es auslöst, ist, dass die Assembly, in der sich der Code befindet, nicht gefunden werden kann.
Unable Montage finden 'AssemblyBeingUsed, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null'
Dieses leicht mich ist verwirrend, wenn die Anordnung bereits zugegriffen wird und dessen sagen, dass es kann nicht gefunden werden. Der Code, der die Fehlermeldung formatiert, ist Teil derselben Assembly!
Hier ist der Stack-Trace für die Ausnahme.
bei System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly() bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType (BinaryAssemblyInfo Assembly, String name) bei System.Runtime. Serialization.Formatters.Binary.ObjectMap..ctor (String objectName, String [] memberNames, BinaryTypeEnum [] binaryTypeEnumA, Object [] typeInformationA, Int32 [] memberAssemIds, ObjectReader objectReader, Int32 objektId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable) bei System. Runtime.Serialization.Formatters.Binary .__ BinaryParser.ReadObjectWithMapTyped (BinaryObjectWithMapTyped record) bei System.Runtime.Serialization.Formatters.Binary .__ BinaryParser. ReadObjectWithMapTyped (BinaryHeaderEnum binaryHeaderEnum) bei System.Runtime.Serialization.Formatters.Binary .__ BinaryParser.Run() bei System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize (HeaderHandler Handler, __BinaryParser serParser, Boolean fcheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) bei System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize (Stream serializationStream, HeaderHandler Handler, Boolean fcheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
bearbeiten: Weitere nützliche Informationen.
Diese Funktion wird niemals direkt von vb6 aufgerufen. Da es Generika verwendet, bin ich mir ziemlich sicher, dass dies sowieso unmöglich wäre. Diese Funktion wird von einem Formular aufgerufen, das von der vb6-Anwendung geladen wird. Wenn dieses Formular aus einer C# -Anwendung verwendet wird, gibt es kein Problem, obwohl es genau dasselbe tut.
Das Visual Studio-Projekt verwendet die Option "Für COM-Interop registrieren", und die Assembly wird als Referenz in das vb6-Projekt geladen.
bearbeiten: Ausgabe von Fuslogvw.exe
Die Ausgabe von Fuslogvw.exe zeigt 5 Einträge mit der Baugruppe zugeordnet I in (BarcodeAndOperatorDatabase) interessiert bin. Da es ziemlich lang ist, wenn sie kombiniert werden, habe ich alle Ausgaben auf this file hochgeladen.
Um ehrlich zu sein, ich bin mir nicht sicher, was ich sehe. Es gibt drei Vorgänge, die meiner Meinung nach beim Binden der Assembly übereinstimmen:
15:29:06: VB6-Anwendung gestartet, Operation war erfolgreich.
15:29:14 (2 Einträge): Formular von Assembly geladen (denke ich), Operation fehlgeschlagen. Das ist verwirrend, da das Formular korrekt geladen wird und interagiert werden kann.
15:29:50 (2 Einträge): Button klicken, die fehlschlägt, wenn die CloneObject-Methode aufgerufen wird, Operation fehlgeschlagen.
Etwas von einem wilden Schuss, aber haben Sie dlls in mehr als einem Verzeichnis? Wenn Sie diese Art von Twilight-Zone-Verhalten erhalten, wenn 2 Kopien der gleichen DLL von der exe gefunden werden können. –
Es sieht so aus, als ob Sie Probleme beim Parsen einer Ganzzahl haben. Hat die Eingabe Nullen? Versuchen Sie Int? anstelle von int. Haben die ganzen Zahlen Dezimalstellen (Punkt oder Kommas)? Gibt es Leerzeichen zwischen der +/- und der Nummer? VB ist ein wenig besser im Umgang mit verschiedenen Formaten für Zahlen. – jdweng
Klar, ich benutze den GAC nicht, ich rieche eine Assembly.LoadFile() Ratte. –