У меня есть приложение, которое внедряет (через BuildAction: Embedded Resource) ссылочную сборку (называемую ClassLibrary1) внутри себя и загружает его по событию AppDomain.CurrentDomain.AssemblyResolve.
Основная сборка определяет класс Class1:
public class Class1
{
public Class2 MyField { get; set; }
}
У него есть свойство типа Class2, определенное в ClassLibrary1.
Определение класса 2:
public class Class2
{
public int A { get; set; }
}
В основном методе я создаю новый XmlSerializer (typeof (Class1)):
static void Main()
{
SubscribeAssemblyResolver();
MainMethod();
}
private static void MainMethod()
{
XmlSerializer xs2 = new XmlSerializer(typeof(Class1));
Class1 cl = new Class1();
}
При выполнении программы я получаю следующую ошибку:
Невозможно создать временный класс (результат = 1).
ошибка CS0012: тип 'ClassLibrary1.Class2' определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку «ClassLibrary1, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = c06f123f2868e8c8».
Ошибка CS0266: невозможно неявное преобразование типа «объект» в «ClassLibrary1.Class2». Существует явное преобразование (вам не хватает приведения?)
Есть идеи?
Остальной код:
private static void SubscribeAssemblyResolver()
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}
static Dictionary<String, Assembly> _assemblies = new Dictionary<String, Assembly>(StringComparer.OrdinalIgnoreCase);
static System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
return ResolveAssembly(args.Name);
}
private static Assembly ResolveAssembly(string argsName)
{
Assembly dll;
var name = "WindowsFormsApplication1.Libs." + new AssemblyName(argsName).Name + ".dll";
if (!_assemblies.TryGetValue(name, out dll))
{
Assembly res = typeof(Program).Assembly;
using (var input = res.GetManifestResourceStream(name))
{
if (input == null)
{
//TODO: log
return null;
}
Byte[] assemblyData = new Byte[input.Length];
input.Read(assemblyData, 0, assemblyData.Length);
if (null == (dll = Assembly.Load(assemblyData)))
{
//TODO: log
return null;
}
//TODO: log
_assemblies[name] = dll;
return dll;
}
}
return dll;
}
ОБНОВЛЕНИЕ: Создано BUG на сайте Microsoft Connect. Вы также можете загрузить пример решения Visual Stuido 2010 (просто разверните группу полей Подробности), чтобы воспроизвести его.