问题标签 [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.
.net - 如何在不加载该程序集的情况下将 AssemblyName 解析为程序集文件路径?
.NET Framework、.NET Core 或 .NET Standard 中是否有任何公共 API 可以将 a 解析为System.Reflection.AssemblyName
将要加载的程序集文件的文件路径,而无需实际加载该程序集?
我目前得到的最好的是:
但这仍然会导致程序集被加载(尽管只加载到仅反射上下文中)。
(假设我不想改变运行时定位程序集的方式。我要求在库中使用它,我不能随意检查应用程序配置文件、定义AppDomain.AssemblyResolve
处理程序等)
c# - 如何在不访问应用程序目录的情况下将程序集从字节数组加载到非默认 AppDomain 中?
我有一个在MyAssembly
我的主程序集中使用的内存程序集(类库)MyApp.exe
:
(对于测试,该GetAssemblyDataFromSomewhere
方法可以只File.ReadAllBytes
对现有的程序集文件执行,但在我的真实应用程序中没有文件。)
MyAssembly
仅具有 .NET Framework 引用,并且不依赖于任何其他用户代码。
我可以将此程序集加载到当前(默认)中AppDomain
:
现在,我想将此程序集加载到不同AppDomain
的地方并在那里实例化该类。MyNamespace.MyType
派生自MarshalByRefObject
,因此我可以跨应用程序域共享实例。
是的,我知道AppDomain.Load
文档中有一条注释:
此方法应仅用于将程序集加载到当前应用程序域中。
是的,它应该用于那个,但是......
如果当前
AppDomain
对象表示应用程序域A,并且从应用程序域BLoad
调用该方法,则程序集将加载到两个应用程序域中。
我可以忍受这一点。如果程序集将被加载到两个应用程序域中,对我来说没有问题(因为我实际上将它加载到默认应用程序域中)。
我可以看到该程序集已加载到新的应用程序域中。有点儿。
这给了我:
但是尝试实例化类总是会导致 a FileNotFoundException
,因为 CLR 尝试从文件加载程序集(尽管它已经加载,至少根据AppDomain.GetAssemblies
)。
我可以这样做MyApp.exe
:
这可行,但这会导致第二个应用程序域MyApp.exe
从文件加载调用程序集 ()。发生这种情况是因为该应用程序域现在需要来自CustomResolver
调用程序集的代码(方法)。
我可以将应用程序域创建逻辑和事件处理程序移动到不同的程序集中,例如MyAppServices.dll
,因此新的应用程序域将加载该程序集而不是MyApp.exe
.
但是,我想不惜一切代价避免文件系统访问我的应用程序目录:新的应用程序域不得从文件中加载任何用户程序集。
我也试过AppDomain.DefineDynamicAssembly
了,但这也没有用,因为返回值的类型System.Reflection.Emit.AssemblyBuilder
既没有MarshalByRefObject
也没有标记[Serializable]
。
有没有办法将字节数组中的程序集加载到非默认值AppDomain
中,而无需将调用程序集从文件加载到该应用程序域中?实际上,没有任何文件系统访问我的应用程序目录?
c# - 如何修复“此模板试图加载组件程序集 'LigerShark.Templates'”
我正在尝试基于模板模型创建一个新的 C# 应用程序。此模板使用 Ligershark(侧华夫饼)。在创建时,我收到了这个错误
我尝试了什么:
我在 github ( https://github.com/ligershark/side-waffle ) 上下载了项目,构建了解决方案并将 Ligershark.Templates.dll 添加到 GAC ( https://docs.microsoft.com/fr-fr/ dotnet/framework/tools/gacutil-exe-gac-tool)。
但它什么也没做。
我访问了几个关于同一类型错误的问题,但提出的解决方案对我不起作用..
提前致谢,
mono.cecil - 在 Mono.Cecil 中解析对 TypeDefinition 的 TypeReference 失败并出现程序集解析错误
我正在尝试从 .NET 类型中获取 Mono.Cecil TypeDefinition 并且没有任何运气。
我正在使用这样的代码:
但它因程序集解析错误而失败:
GetConfigurationPropertiesTest [0:29.990] 失败:Mono.Cecil.AssemblyResolutionException:无法解析程序集:'MarkdownMonster,Version=1.18.11.0,Culture=neutral,PublicKeyToken=null' Mono.Cecil.AssemblyResolutionException:无法解析程序集:'MarkdownMonster, Version=1.18.11.0,Culture=neutral,PublicKeyToken=null' at Mono.Cecil.BaseAssemblyResolver.Resolve(AssemblyNameReference name, ReaderParameters parameters) at Mono.Cecil.DefaultAssemblyResolver.Resolve(AssemblyNameReference name) at Mono.Cecil.MetadataResolver.Resolve( TypeReference 类型)在 Mono.Cecil.TypeReference.Resolve() 在 Westwind.TypeImporter.TypeParser.ParseObject(Type type, Boolean dontParseMembers)
程序集显然在那里,因为 TypeReference 导入似乎工作并产生了有效的 TypeReference。
有问题的程序集是一个 EXE,只是为了好玩,我将它重命名为 DLL,但这没有任何效果。
.net - Microsoft.Diagnostics.Tracing.EventSource 与 RabbitMQ.Client.dll 异常
为什么我会收到以下错误,我该如何解决?
RabbitMQ.Client.dll 中出现“System.IO.FileLoadException”类型的未处理异常无法加载文件或程序集“Microsoft.Diagnostics.Tracing.EventSource,版本=1.1.28.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或一个其依赖项。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)
更新
在下面的评论部分发表评论后,我试图在Visual Studio 2019中找到Microsoft.Diagnostics.Tracing.EventSource。我为此使用了快捷方式,但仍然找不到该文件。文件可以放在哪里?Ctrl + Shift + T
c# - AssemblyLoadContext 是否隔离静态变量?
公告告诉我们:
程序集可卸载性是 AssemblyLoadContext 的一项新功能。从 API 的角度来看,这项新功能在很大程度上是透明的,仅通过几个新 API 即可公开。它可以卸载加载程序上下文,释放实例化类型、静态字段和程序集本身的所有内存。应用程序应该能够通过这种机制永远加载和卸载程序集,而不会发生内存泄漏。
此外,该设计说明还提到了“静力学”。
我试过这个简单的测试:
它输出“16”,表示隔离不起作用。
我的目标是对可以抛出异常的类静态成员进行单元测试。通常的测试可以通过触发类型初始化器来影响彼此的行为,所以我需要以最便宜的方式隔离它们。测试应在 .NET Core 3.0 上运行。
这是正确的方法吗,可以AssemblyLoadContext
帮忙吗?
c# - 在运行时手动加载程序集和依赖项(nuget 依赖项和 FileNotFoundException)
我目前在运行时使用Assembly.LoadFrom(String)
. netcoreapp
虽然指定的程序集加载得很好,但当目标框架为或时,不会加载引用的第三方程序集(例如 nuget 包)netstandard
。
为了找出问题,我创建了一个由三个项目组成的简单解决方案。每个项目只包含一个类。我在Newtonsoft.Json
这里用作 nuget 示例,但它可以是任何其他程序集。
ClassLibrary0.csproj
ClassLibrary1.csproj
具有对Newtonsoft.Json
via的包引用nuget
。对附加程序集的引用ClassLibrary0
取决于TargetFramework
(糟糕的条件ItemGroups
)。
ClassLibrary2.csproj
有一个项目参考ClassLibrary1
。
运行dotnet restore
并重建解决方案后,可以在输出目录中观察到根本问题:
问题:
- 的副本
ClassLibrary0.dll
存在于所有输出目录中(=> 对第三方的引用很好)。 - 的副本
ClassLibrary1.dll
存在于ClassLibrary2
(=> 项目引用的所有输出目录中也很好)。 - 的副本
Newtonsoft.Json
仅存在于net
输出目录中,但在所有netcoreapp
和netstandard
. - 所有目录
netcoreapp
和netstandard
输出目录都包含一个*.deps.json
文件,该文件正确地将Newtonsoft.Json
包称为依赖项。
然而,在 和的情况下,调用不会Assembly.LoadFrom(String)
加载这些依赖项。这会导致在运行时从指定的加载程序集中运行代码。Newtonsoft.Json
netcoreapp
netstandard
FileNotFoundException
我试过的:
我正在尝试通过附加到AppDomain.AssemblyResolve
事件来解决这些问题,但到目前为止我很不走运。那些*.deps.json
不包含依赖项的位置路径。
我尝试在Path
环境变量中的所有位置查找程序集,但 nuget 包位置似乎没有在此处列出。我所有机器上的位置似乎都是%userprofile%\.nuget\packages\package-name\version\
. 但是,我不是 100% 肯定这将始终是所有可能执行我的代码的机器上 nuget 包的正确位置。
实际问题:
手动加载程序集时,是否有可靠的方法在运行时解决 nuget 依赖项?
限制:
- 这需要是一个离线解决方案,无需即时下载软件包版本。
- 不能依赖于
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>
原来的项目。 - 不能依赖我对相关依赖项的引用。这样做的全部目的是能够动态加载我在编译时不知道的程序集。
c# - 与常规垃圾收集相比,.NET Core 中的 AssemblyLoadContext.Unload() 的值是多少?
.NET Core 3.0 引入了 collectible AssemblyLoadContext
,它允许调用Unload()
方法来卸载上下文中加载的程序集。
根据文档(https://docs.microsoft.com/en-us/dotnet/standard/assembly/unloadability#troubleshoot-unloadability-issues),卸载是异步的,任何对上下文或对象的引用都会阻止上下文卸货。
我想知道如果我失去对 的引用会怎样AssemblyLoadContext
,这会导致泄漏(因为我没有更多的上下文可以调用Unload()
)。测试证明这不会导致泄漏,即使没有Unload()
显式调用,也会卸载未使用的程序集:
该测试还表明,使用Unload()
在 1 次 GC 会话后卸载上下文,是否Unload()
需要 2 次会话才能卸载。但可能只是巧合,并不总是可重现的。
所以,鉴于
- 对可收集上下文的任何引用都将阻止它卸载(因此可以
Unload()
在加载所有您需要在不使用时安排卸载的程序集之后调用)。 - 即使没有调用
Unload()
可收集的上下文,一旦不再使用,它也会被卸载。
这种方法的目的是什么,使用和简单依赖GC有什么Unload()
区别?Unload()
c# - 如何使用外部迁移程序集从代码迁移 EFCore 数据库?
我正在使用 .NET Core 3.1 和 Entity Framework Core 创建一个包含 IdentityServer4 的应用程序。它的目的是可以针对多种数据库类型。
在各种示例之后,除了包含 DbContexts 的 IdentityServer 项目本身之外,我还通过使用两个单独的迁移程序集,设法让它与 SQL Server 和 MySQL 一起工作。
在 Startup.cs 我有以下内容:
其中 ServerType 是“SqlServer”或“MySql”的配置枚举
如果我使用 dotnet 命令行,迁移工作正常
我希望能够使用配置或命令行来让 IdentityServer 自己应用迁移。
例如在 Main()
但是,如果我这样做,我会得到一个例外:
迁移程序集与项目 DLL 和 EXE 位于同一目录中。
我无法解决的是为什么它无法加载迁移程序集。
作为一个实验,我连接了AssemblyLoadContext.Default.Resolving
回调并用于Assembly.LoadFrom(<path>)
手动加载程序集。这可以正常工作并正确应用迁移,但这是一个非常混乱的解决方法。
任何人都可以解释为什么在调用时程序集加载失败context.Database.Migrate()
,但在使用 ef 工具或在Resolving
回调中手动加载时却没有?
编辑
我想我找到了一种解决方法,它与我们在同一解决方案中的另一个项目中所做的相匹配。
我们在该项目的运行时将模块动态加载到 Dot Net Core DI 框架中,并且模块中的迁移似乎工作正常。
我已将Scutor
库添加到项目中,以将手动加载的迁移程序集扫描到 DI 服务集合中。尽管它没有注册任何类,但这似乎足以将程序集加载到 中,AssemblyLoadContext
以便迁移代码能够加载它。
然而,这并不能解释为什么它不能自动加载迁移程序集。
c# - netcore 3.1 中的 AssemblyLoadContext.Default 解析插件类型,但当插件使用传递依赖时无法执行其实例
我在 netcoreapp3.1 中有一个使用 netstandard2.0 插件的控制台应用程序。该插件引用一个类库并实现一个接口所有dll依赖项都在插件文件夹中,plugin.dep.json包含所有引用的库。
当我运行时:
它解析接口的类型
当我尝试运行下面给出的实例时,它失败了:
并触发错误消息:
System.IO.FileNotFoundException:'无法加载文件或程序集'MyLibObjectsLib,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null'。该系统找不到指定的文件。'
如果我加载了所有依赖项,它工作正常。
使用 AssemblyLoadContext.Default 时应该加载所有依赖项还是一个错误?