5

呼び出しをシリアル化および逆シリアル化するプログラムがあり、DLL を別のプログラムにアタッチしようとすると、次のように表示されます。Unable to find assembly 'ASCOM.BHOProxy.Connector, Version=1.0.0.0, Culture=neutral, PublicKeyToken=74643865492aa2e6'.

これが参照の問題か何かであるかは理解できましたが、問題は、例外をスローするコード ASCOM.BHOProxy.Connector. ある種のサードパーティのシリアライザーを使用することを考えましたが、何を使用すればよいかよくわかりません。アセンブリは、アプリケーションによって読み込まれる別の DLL によって読み込まれます。

シリアル化されたデータは、TCP 接続を介して同一のコネクタ (多くの場合、別のプログラムによって読み込まれた同じファイル) に送信され、そこで逆シリアル化されます。逆シリアル化しようとすると例外がスローされますが、外部プログラムから呼び出された場合にのみ例外がスローされます。Visual Studio でのデバッグ時に問題なく動作します。

Their Program --(late binding)--> My Main DLL --(.NET Project Reference)--> My Connector DLL

スタックトレース:

   at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
   at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
   at 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)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
   at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)
   at Connector.PortComProxy.DecodeMessage(List`1 buff) in c:\Users\Arlen\Documents\Visual Studio 2012\Projects\DriverProxy\PortComClient\PortComProxy.cs:line 259
4

2 に答える 2

5

ケンさん、ありがとうございます。これは、それを必要とする可能性のある他の人のために私がしたことです。リゾルバーが静的かどうかで違いが生じるかどうかはわかりません。

using System.Reflection;
...
public class MyClass{
    public MyClass()
    { 
        AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(MyResolveEventHandler);
    }
    private static Assembly MyResolveEventHandler(object sender, ResolveEventArgs args)
    {
        return typeof(MyClass).Assembly;
    }
}
于 2013-01-06T00:23:46.387 に答える
5

アセンブリが時々見つからない理由はわかりません。ただし、AppDomain.AssemblyResolveイベントを使用して、.NET によって提供される通常のアセンブリ ロード解決では見つからなかったアセンブリをロードしました。私の場合、レジストリ エントリからアセンブリを検索する必要があったため、イベントを使用してアセンブリを検索してロードし、アセンブリが見つからないという例外を防ぐことができました。

少なくとも、このイベントを利用することで、BinaryFormatter が解決しようとしている型を確認できる可能性があります。

于 2013-01-05T01:03:04.750 に答える