У меня есть блок Library1.dll
который содержит некоторые Интерфейсы, которые были сериализированы как массив байтов в базу данных. По некоторым причинам мы должны изменить свойства Interface и определение. таким образом, теперь я пишу утилиту миграции. Таким образом, у меня есть 2 версии Library1.dll
, В моей утилите я создал папку, где я храню новую версию Library1.dll
. Эта утилита в свою очередь также ссылки Library1.dll
следовательно в мусорном ведре папка содержит Library1.dll
но этот dll компилируется на более старой версии. Моя новая версия Library1.dll
хранится в частном пути, к которому я являюсь передающим Assembly.ReflectionOnlyLoadFrom
функция для инстанцирования и следовательно GetTypes
на блоке, загруженном, который далее позволил бы мне сделать преобразование данных.
Но я всегда добираюсь ReflectionTypeLoadException
при попытке загрузиться Library1.dll
от частного пути.
Помогите парням!!!. любая справка ценилась бы. Я действительно застреваю.
Thanks, AG
Если ваша библиотека ссылается на другую dll, GetTypes завершится ошибкой при попадании в тип, использующий внешний тип. В отличие от обычной загрузки сборки, загрузка сборки ReflectionOnly не разрешает зависимости. Вы можете либо подписаться на AppDomain.CurrentDomain.ReflectionOnlyAssemblyResolve и загрузить зависимости по мере необходимости, либо вы можете предварительно загрузить их.
Это код, который я использую для этого:
var assembly = Assembly.ReflectionOnlyLoadFrom(assemblyPath);
foreach (var assemblyName in assembly.GetReferencedAssemblies()) {
try {
Assembly.ReflectionOnlyLoad(assemblyName.FullName);
} catch {
Assembly.ReflectionOnlyLoadFrom(Path.Combine(Path.GetDirectoryName(assemblyPath), assemblyName.Name + ".dll"));
}
}
Это попытается загрузить все зависимости загруженной сборки, предназначенной только для отражения, сначала по полному имени, затем по пути (при условии, что зависимость находится в том же каталоге, что и загруженная сборка ).