gpt4 book ai didi

c# - 程序集在运行时解析

转载 作者:行者123 更新时间:2023-11-30 18:17:27 25 4
gpt4 key购买 nike

我想使用 AssemblyResolver 事件在我的应用程序中动态加载程序集,但我不知道该怎么做。

我看过这个tutorial并亲自尝试过。在技​​巧 3 中,他写道:

static void Main(string[] args)
{
AppDomain.CurrentDomain.AssemblyResolve += ResolveAssembly;
}
static void Print()
{
var mainClass = new MainClass();
mainClass.Print();
}

static Assembly ResolveAssembly(object sender, ResolveEventArgs args)
{
return Assembly.LoadFile(@"path to the library");
}

其实我根本不明白这段代码应该如何编译...new MainClass() 无法编译,因为它未知(类型尚未加载),加载发生在运行时。
如果 MainClass 是已知类型,则根本不应该对其进行解析...

这段代码应该如何工作?

最佳答案

如果编译是因为您可能使用MainClass 类型和Print 方法引用了库,即使它是一个没有任何实际实现的空 stub ——或者只是错误的实现。这不是“未知”。如果它未知的,那么这段代码确实无法编译,您必须在运行时使用反射来查找类型,并使用反射来实例化实例,并使用反射来调用 Print() 方法(除非有一些众所周知的接口(interface)或基类可以转换为,或者您使用 dynamic)。

这就是编译某些东西所需的全部:元数据。事实上,相对常见正是以“引用库”为目标 - 这正是您的 IDE 中有多少多目标功能起作用。

运行时,您可以覆盖负载以提供预期库,但老实说,部署实际通常更容易> 将库放入应用程序的探测路径中(通常:在主 exe 旁边)。此外,在您的 ResolveAssembly 方法中,最好检查正在请求哪个程序集 - 它可能会尝试加载完全不相关的东西,在这种情况下就离开一个人。

关于c# - 程序集在运行时解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43582032/

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