gpt4 book ai didi

c# - 将 DLL 加载到单独的 AppDomain 中

转载 作者:太空狗 更新时间:2023-10-30 00:45:55 24 4
gpt4 key购买 nike

我正在编写一个插件架构。我的插件 dll 位于运行插件管理器的子目录中。我将插件加载到单独的 AppDomain 中,如下所示:

string subDir;//initialized to the path of the module's directory.
AppDomainSetup setup = new AppDomainSetup();
setup.PrivateBinPath = subDir;
setup.ApplicationBase = subDir;

AppDomain newDomain= AppDomain.CreateDomain(subDir, null, setup);

byte[] file = File.ReadAllBytes(dllPath);//dll path is a dll inside subDir
newDomain.Load(file);

但是。 newDomain.Load 返回当前域尝试加载的程序集。因为插件 dll 在子目录中,当前域不能也不应该看到这些 dll,并且当前域抛出 FileLoadException"ex = {"无法加载文件或程序集...或其依赖项之一。"

问题是,我们可以将一个程序集加载到一个单独的 AppDomain 中而不返回加载的程序集吗?

我知道我可以为当前域中的 AssemblyResolve 事件添加处理程序并返回 null,但我宁愿不走这条路。

提前致谢。

最佳答案

您还可以使用 DoCallBack - 这是我在 SO 上阅读了大量相关内容后整理的内容。这将创建一个应用程序域,检查程序集是否具有相同的签名公钥,加载程序集,执行静态方法,卸载应用程序域,然后删除 dll。

static void Main(string[] args)
{
string unknownAppPath = @"path-to-your-dll";

Console.WriteLine("Testing");
try
{
AppDomainSetup setup = new AppDomainSetup();
setup.AppDomainInitializer = new AppDomainInitializer(TestAppDomain);
setup.AppDomainInitializerArguments = new string[] { unknownAppPath };
AppDomain testDomain = AppDomain.CreateDomain("test", AppDomain.CurrentDomain.Evidence, setup);
AppDomain.Unload(testDomain);
File.Delete(unknownAppPath);
}
catch (Exception x)
{
Console.WriteLine(x.Message);
}
Console.ReadKey();
}

public static void TestAppDomain(string[] args)
{
string unknownAppPath = args[0];
AppDomain.CurrentDomain.DoCallBack(delegate()
{
//check that the new assembly is signed with the same public key
Assembly unknownAsm = AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(unknownAppPath));
//get the new assembly public key
byte[] unknownKeyBytes = unknownAsm.GetName().GetPublicKey();
string unknownKeyStr = BitConverter.ToString(unknownKeyBytes);
//get the current public key
Assembly asm = Assembly.GetExecutingAssembly();
AssemblyName aname = asm.GetName();
byte[] pubKey = aname.GetPublicKey();
string hexKeyStr = BitConverter.ToString(pubKey);
if (hexKeyStr == unknownKeyStr)
{
//keys match so execute a method
Type classType = unknownAsm.GetType("namespace.classname");
classType.InvokeMember("method-you-want-to-invoke", BindingFlags.InvokeMethod, null, null, null);
}
});
}

关于c# - 将 DLL 加载到单独的 AppDomain 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4511405/

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