Исключение сериализации в LoadFrom'ed .NET Class Library

Я получаю исключение SerializationException с сообщением о том, что не удается найти сборку, когда я десериализую в классе, который был вызван с помощью отражения. Тестовое решение имеет консольное приложение и библиотеку классов.

Вот и все приложение:

using System;
using System.Reflection;

namespace ConsoleApplication
{
    class Program
    {
        static void Main( string[] args )
        {
            //  Dynamically link ClassLibrary.dll, construct a Class1, and call it's Test().
            Assembly classLibraryAssembly = Assembly.LoadFrom(
                "..\\..\\..\\ClassLibrary\\bin\\Debug\\ClassLibrary.dll" );
            Type classLibraryClassType = classLibraryAssembly.GetType(
                "ClassLibrary.Class1" );
            ConstructorInfo constructorInfo = classLibraryClassType.GetConstructor(
                Type.EmptyTypes );
            object classLibrary = constructorInfo.Invoke( null );
            object[] parameters = new object[ 0 ];
            MethodInfo methodInfo = classLibraryClassType.GetMethod(
                "Test", BindingFlags.Public | BindingFlags.Instance );
            methodInfo.Invoke( classLibrary, parameters );
        }
    }
}

Вот вся библиотека классов:

using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace ClassLibrary
{
    public class Class1
    {
        public void Test()
        {
            //  Serialize an object, then deserialize it.
            byte[] serializedObject;
            Class2 class2 = new Class2();
            class2.SomeString = "Hello";
            BinaryFormatter binaryFormatter = new BinaryFormatter();
            using ( MemoryStream memoryStream = new MemoryStream() )
            {
                binaryFormatter.Serialize( memoryStream, class2 );
                serializedObject = memoryStream.ToArray();
            }
            using ( MemoryStream memoryStream = new MemoryStream() )
            {
                memoryStream.Write( serializedObject, 0, serializedObject.Length );
                memoryStream.Seek( 0, SeekOrigin.Begin );
                class2 = (Class2) binaryFormatter.Deserialize( memoryStream );
            }
            string theString = class2.SomeString;
        }
    }

    [Serializable]
    public class Class2
    {
        public string SomeString;
    }
}

Линия:

class2 = (Class2) binaryFormatter.Deserialize( memoryStream );

вызывает исключение SerializationException с сообщением:

Unable to find assembly 'ClassLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

Я нахожу это странным, тем более что он работает в той сборке. Я подозреваю, что это проблема контекста Load против LoadFrom, но я не совсем понимаю, или как решить эту проблему.

Спасибо заранее за вашу помощь.

1 ответ

Спасибо Офиру за предложение скопировать DLL в рабочий каталог. Следующее изменение сработало, позволив использовать Load() вместо LoadFrom():

File.Copy(
    "..\\..\\..\\ClassLibrary\\bin\\Debug\\ClassLibrary.dll",
    "ClassLibrary.dll",
    true );
Assembly classLibraryAssembly = Assembly.Load( "ClassLibrary" );

Спасибо!

Другие вопросы по тегам