问题标签 [assembly-loading]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
50 浏览

c# - 多次加载程序集的语义

我正在开发一个插件系统,用户很可能会在命名空间中显示包含同名类的新程序集,因为他们正在安装已安装的更新版本。

加载包含已由其他已加载程序集定义的类的程序集时,预期的行为是什么?

在 DNFX 中,这是由 AppDomains 明确定义的,但它们在 netcore 中已被 AssemblyLoadContexts 取代,后者不是程序集执行上下文。

当我两次加载相同的程序集时,没有报告异常,但我想知道我是否已经替换了类或没有效果,以及任何其他语义。非常欢迎您回答建议的研究术语或相关文档的链接。

到目前为止,我发现了这个:https ://github.com/dotnet/runtime/issues/39783

似乎说使用 AssemblyLoadContexts 可以多次加载程序集,但它没有说明这对于具有相同全名的两个类以及实例化它们的代码意味着什么。

我想当我加载一个程序集对象并将其显式用于 CreateInstance 时,我将获得该程序集中定义的类,但我仍然希望看到有关此的文档。

0 投票
1 回答
82 浏览

c# - 为什么在 unload 事件触发后 AppDomain 仍然引用动态加载的程序集?

这是一个 netcore 问题,而不是 NETFX 问题。

此检查演示了该行为。您将需要提供一个程序集以使其加载并使代码中的名称与文件系统中的名称匹配。

如果您运行此程序,您将看到卸载事件触发,但程序集的两个实例继续由currentDomain.GetAssemblies().

文档AssemblyLoadContext.Unload()

  • 一个 AssemblyLoadContext 只能在它是可收集的情况下被卸载。
  • 卸载将异步进行。
  • 存在对 AssemblyLoadContext 的引用时不会发生卸载

我相信这个例子满足了所有这些要求。还有什么可能干扰?有任何已知的错误吗?

是否有可能实际卸载了程序集但 currentDomain 未能更新其簿记?你会怎么说?

0 投票
1 回答
23 浏览

c# - 使用 ResolveEventHandler 加载资源 DLL

我有一个处理程序来帮助通过ResolveEventHandler. 但是当我有这个处理程序时,我得到一个关于资源 DLL 的错误。我什至在我的 PC 上都看不到(尽管我有这个 DLL 的实例,用于其他文化,如 es-ES、de-De、...):

FileNotFoundException:无法加载文件或程序集“Microsoft.Data.Tools.Schema.Sql.resources,版本=15.0.0.0,Culture= en-US,PublicKeyToken=b03f5f7f11d50a3a”

当我在没有处理程序的情况下运行时,我看到加载了以下程序集:

Microsoft.Data.Tools.Schema.Sql,版本=15.0.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a

我应该在处理程序或其他地方做什么来解析这个资源 DLL?

0 投票
0 回答
17 浏览

c# - 加载汇编接口而不共享公共库

我想知道是否需要在 assemblyA 和 assemblyB 之间共享公共库。需要实现的是在 assemblyB 代码中加载 assemblyA 并在加载(从对象)其中一种类型后将接口转换如下。我读到了一些条件,例如在每个程序集 A 和程序集 B 中定义的两个接口之间共享某种父类/接口。我们能否以某种方式实现完全解耦,而不必共享某种类型的公共库?

在运行时引入 assemblyA 的当前代码如下所示:

0 投票
0 回答
28 浏览

.net - 如何使用 Emit 从 DynamicAssembly 加载程序集

如何在 .NET5 中加载 DynamicAssembly 使用 Emit?

我在 loadContext.LoadFromAssemblyName(...) 处收到错误

InvalidOperationException:已解析程序集的简单名称应与请求的程序集相同。

我错过了什么?任何帮助或示例代码都对我有用。

0 投票
0 回答
25 浏览

razor - 无法使剃刀视图与自定义程序集加载上下文一起使用

我正在使用程序集加载上下文在我的主机应用程序中加载插件 Web 应用程序(以前我使用过 AppDomains)

问题是剃须刀无法正常加载加载视图。

我越来越:

我使用了 dnSpy 并检测到视图程序集生成工作正常,但是 RazorCompiledItemLoader.LoadItems(assembly) 给出了 0 个项目,因为 assembly.GetCustomAttributes() 给出了 0 个属性。

但是 RazorCompiledItemAttribute 实际上是存在的!我已经通过 dnSpy 保存了视图程序集并转储到磁盘。当我在 ConfigureServices(IServiceCollection services) 期间尝试在插件内部获取自定义属性时...(例如)我得到 0 个匹配的属性。但是外部插件调用我得到 1 个匹配属性!如何让剃刀加载这个 RazorCompiledItemAttribute?

0 投票
1 回答
71 浏览

.net-core - 为什么强制降级会导致 .Net Core 中的程序集加载异常?

我有一个带有控制台和库项目的示例解决方案。两者都引用了相同的 nuget,但版本不同。控制台项目也有对库项目的引用。所以结构是这样的:

您可以在此处找到解决方案。

由于 Nuget 使用最近的 wins 规则,因此被解析的 nuget 包是版本 5.2.0。这就是我想要的,到目前为止一切顺利。但是当我运行应用程序并运行库的方法时,我得到以下异常:

在 .NET Framework 中,我将通过程序集重定向来解决这个问题。但这在 .Net Core 中不可用。我一直认为 .Net Core 通过使用 deps.json 文件自动解决了这个问题。在那里我看到以下声明:

但仍然在运行时,他尝试解析 6.0.0 版本。我正在使用最新的 .Dot Net 3.1.X SDK。

我做错了什么还是这看起来像一个错误?

作为记录,这是一个简单的示例项目。我需要这个的实际情况要复杂得多。我也明白这样做会在运行应用程序时导致运行时异常。

0 投票
0 回答
43 浏览

.net-core - 在 .NET Core AssemblyLoadContext 中加载为不同运行时版本构建的 DLL

我们使用 .NET 6AssemblyLoadContext来设置插件系统。

例如,是否可以在AssemblyLoadContext为 .NET 6 构建的进程中加载​​ .NET Core 3 或 .NET 5 dll?这样做有什么影响和/或副作用?

是否应该考虑某些最佳实践,或者在AssemblyLoadContexts 中混合运行时版本是根本不应该做的事情?