Исключение сериализации в 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" );
Спасибо!