gpt4 book ai didi

c# - 从另一个 AppDomain 接收程序集引用时出现异常

转载 作者:太空狗 更新时间:2023-10-29 21:54:44 25 4
gpt4 key购买 nike

我正在加载新 AppDomain 中特定“扩展”目录中的所有 DLL,以从中获取一些与反射相关的信息。

这就是我正在尝试的:

我在我的解决方案中创建了一个新库 AssemblyProxy,它只有这个类:

public class AssemblyProxy : MarshalByRefObject
{
public Assembly LoadFile( string assemblyPath )
{
try
{
return Assembly.LoadFile( assemblyPath );
}
catch
{
return null;
}
}
}

我确保这个 DLL 存在于我的“扩展”目录中。然后,我使用以下代码将所有程序集从“extensions”目录加载到新的 AppDomain 中。

foreach( string extensionFile in Directory.GetFiles( ExtensionsDirectory, "*.dll" ) )
{
Type type = typeof( AssemblyProxy.AssemblyProxy );
var value = (AssemblyProxy.AssemblyProxy) Domain.CreateInstanceAndUnwrap(
type.Assembly.FullName,
type.FullName );

var extensionAssembly = value.LoadFile( extensionFile );

types.AddRange( extensionAssembly.GetTypes() );
}

有些 DLL 确实加载成功,但在某些 DLL 上会抛出异常,如下所示:

无法加载文件或程序集 'Drivers, Version=2.3.0.77, Culture=neutral, PublicKeyToken=null' 或其依赖项之一。系统找不到指定的文件。

编辑:新的 AppDomain 中没有抛出异常。 DLL 已成功加载到新的 AppDomain 中。一旦程序集引用返回到主/调用 AppDomain,就会引发异常。主/调用 AppDomain 是否尝试在仅接收引用时自行加载程序集?

谢谢。

最佳答案

你不应该从新的 AppDomain 返回一个 Assembly 对象,因为这只有在你的主 AppDomain 可以访问那些程序集时才有效它不会,因为程序集位于一个目录中:

避免这种情况的一种方法是遵循 leppie 的评论并:

  1. 创建一个序列化类型,其中包含您从 Assembly 对象中需要的最少信息。
  2. 将此类型添加到两个 AppDomain 都可以访问的新程序集。最简单的方法是将其添加到 GAC。

另一种方法是使用 Mono.Cecil而不是 System.Reflection。 Mono.Cecil 将允许您在不加载程序集的情况下检查程序集。对于一个非常简单的示例,请查看此 answer 的后半部分.

关于c# - 从另一个 AppDomain 接收程序集引用时出现异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com