У меня такая проблемма. Существует иеархия классов, при чем базовый класс и большое множество производных от него классов раскиданы по разным dll-кам (в одной - сколько угодно производных классов). И мне необходимо сохранять состояние классов (использую SOAP сериализацию). Так вот, если эти dll-ки подключаю статически, то все нормально, но когда динамически - возникает ошибка при попытке десериализировать, при чем на этапе разбора элементов XML файла.
Сериализация:
Vitone
Динамически - это как?
Библиотеки подключаются так: ищутся все dll-ки в заданном каталоги и с заданным атрибутом:
Вот привожу код:
Vitone
Похоже, SoapFormatter не заморачивается с поиском библиотек, и тупо сам загружает их через Assembly.Load. А тот, в свою очередь, тупо отвечает что не может загрузить, т.к. не может найти файл на диске и сверить с уже загруженным. Пропиши в конфиге configuration/runtime
/assemblyBinding/probing/@privatePath к папке с длл-ками. Или просто помогай рантайму их резолвить, примерно так:
using System;
using System.IO;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Soap;
namespace ConsoleApplication2
{
class Program
{
private static Assembly sampleAssembly;
static void Main(string[] args)
{
sampleAssembly = Assembly.LoadFrom(@"D:\Projects\sl1\ClassLibrary1\bin\Debug\ClassLibrary1.dll");
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
Stream stream = File.Open(@"D:\temp.txt", FileMode.Open);
SoapFormatter formatter = new SoapFormatter();
object tmp = formatter.Deserialize(stream);
stream.Close();
}
static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
if (args.Name == sampleAssembly.FullName)
{
return sampleAssembly;
}
else
{
return null;
}
}
}
}Звиняй, код на коленке написан. FbdProgram tmp=new FbdProgram();
tmp = (FbdProgram)formatter.Deserialize(stream);
Создал конфигурационный файл Program.exe.config и поместил в папку с экзешником (bin\Debug), прописал в нем такие строчки:
<?xml version="1.0"?>
<configuration>
<runtime>
<assemblyBinding>
<probing privatePath="Blocks;"/>
</assemblyBinding>
</runtime>
</configuration>
Но SoapFormatter все равно не находит сборки, только в папке экзешника.
Что я не так сделал?
Всё, разобрался, спасибо. Вот это мне помогло:
]]>http://forum.codeby.net/go.php?http://www.intuit.ru/department/pl/visualcsharp/9/6.html]]>
Форум Invision Power Board (http://nulled.ws)
© Invision Power Services (http://nulled.ws)