我有一个程序集 Library1.dll
,其中包含一些接口(interface),这些接口(interface)被序列化为数据库中的字节数组。由于某些原因,我们必须更改接口(interface)属性和定义。所以现在我正在编写一个迁移实用程序。所以我有 2 个版本的 Library1.dll
,在我的实用程序中我创建了一个文件夹,我在其中存储新版本的 Library1.dll
。此实用程序反过来也引用 Library1.dll
因此在 bin 文件夹中包含 Library1.dll
但此 dll 是在旧版本上编译的。我的新版本 Library1.dll
存储在一个私有(private)路径中,我将其传递给 Assembly.ReflectionOnlyLoadFrom
函数进行实例化,因此 GetTypes
在程序集已加载,这将使我能够进行数据转换。
但是当尝试从私有(private)路径加载 Library1.dll
时,我总是得到 ReflectionTypeLoadException
。
请大家帮忙!!!任何帮助,将不胜感激。我真的卡住了。
谢谢, 股份公司
最佳答案
如果您的库正在引用另一个 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"));
}
}
这将尝试首先通过全名加载仅反射加载的程序集的所有依赖项,然后通过路径加载(假设依赖项与加载的程序集位于同一目录中)。
关于c# - Assembly.ReflectionOnlyLoadFrom 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2321293/