问题标签 [assemblyresolve]

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 投票
3 回答
748 浏览

c# - 重新触发程序集解决?

我通过将特定 DLL 的“复制本地”设置为 false 来触发 AssemblyResolve。我的 AssemblyResolve 被触发,我可以选择我的 DLL 的位置。

稍后在代码中,我希望 AssemblyResolve 重新触发,以便我可以指定一个新的 DLL 位置,但由于第一个 AssemblyResolve 的 DLL 已成功加载,我无法重新加载新的 DLL。

有没有办法可以清除当前的 DLL 并重新加载它?或类似的东西???

谢谢!

0 投票
1 回答
1040 浏览

.net - 根据引用应用程序的位数适当加载 x64 或 x86 版本的程序集

我有两个程序集都包含相同的命名空间和类。一个是 32 位,命名为 assembly_x86.dll,另一个是 64 位,命名为 assembly_x64.dll。

我希望能够将包含的应用程序构建为 AnyCPU,并让它在 32 位和 64 位操作系统上运行而不会出错。所以我需要它在运行时根据包含进程的位数动态选择正确的引用。我已经为此苦苦挣扎了一段时间,但无法提出任何建议。我觉得我可能错过了一些简单的东西。

我最近的尝试是添加对两个程序集的引用,连接 AssemblyResolve 事件并尝试用 32 位替换 64 位引用,如果它无法像这样加载 64 位版本...

这导致以下异常:

The located assembly's manifest definition does not match the assembly reference.

任何有用的提示将不胜感激。提前致谢。

关于下面的一些评论,我想也许我在描述我的目标方面做得很差。让我详细说明。比如说,我想调用这些程序集中的一个方法——MyClass.MyMethod。

如果我仅使用对 32 位程序集的引用来构建应用程序并将其安装在 32 位机器上,它就可以正常工作。同样,如果我参考 64 位程序集构建它并将其安装在 64 位机器上,一切都很好。但是,我的目标是不必有两个单独的应用程序构建。如果我部署到 32 位机器,我希望它在 32 位程序集中调用 MyClass.MyMethod,如果我部署到 64 位机器,我希望它在 64 位程序集中调用 MyClass.MyMethod。

如果程序集都具有相同的名称(和版本、文化、publickeytoken),我相信它可能会正常工作并选择正确的版本。但是,由于程序集名称不同,因此不会。所以这就是我得出的结论,即我需要在运行时换出引用。

0 投票
0 回答
1213 浏览

c# - 如何始终拦截 CLR 加载事件(不仅在加载尝试失败时)

我知道,当自动 CLR 搜索失败时,注册到 AppDomain.AssemblyResolve 事件来处理加载程序集的尝试是可能的。

在我当前的项目中,通过这种机制处理所有程序集加载会很有帮助;有办法吗?

一个(丑陋的)解决方法是将可执行文件移动到单独的目录中,并让所有内容都由 AssemblyResolve 委托处理;我希望那里有一个更清洁的解决方案。

问候, 安德里亚

0 投票
1 回答
795 浏览

asp.net - 为什么 ASP.NET 以不同的方式解析程序集引用?

我真的很努力地寻找一个类似的问题来获得一些线索,但似乎没有人描述我们所遇到的情况,所以就这样吧。

背景

我们的产品具有以下一般设计:

[本地安装文件夹]

  • 包含一组 .NET 程序集,实现了我们的大部分产品功能。
  • 示例:Implementation1.dllImplementation2.dll

[广汽]

  • 客户端API.dll。我们的客户端程序集,从最终用户 Visual Studio 项目中引用。对本地安装文件夹中的实现 dll 有很强的引用。

在 ClientAPI.dll 中,我们有一个需要最终用户项目调用的入口点。让我们称之为Initialize()

我们要做的第一件事是使用事件在当前域上Initialize安装一个所谓的程序集解析处理程序。AssemblyResolve该处理程序将知道如何定位实现 dll 并将它们加载到客户端进程中,使用Assembly.Load().

考虑一个控制台应用程序。它看起来像:

现在,在控制台/Windows 窗体/WPF 世界中一切都很好。我们的程序集解析处理程序已正确安装和调用,并且一旦 ClientAPI.dll 需要它们的功能,它就可以成功解析对实现 DLL 的引用。

问题陈述

话虽如此,我们不打算仅支持控制台或 WPF 应用程序,因此我们依赖于 ASP.NET 中的相同设计。因此,在 VS 2010 中创建一个新的 ASP.NET Web 应用程序项目,我们认为一切都会像这样简单:

在 ASP.NET 运行时世界中停留了 20 到 30 个小时,在开发服务器和 IIS 中尝试了上述内容,我们了解到那里的情况并不像我们预期的那样。

事实证明,在 ASP.NET 中,只要在任何地方引用ClientAPI该类,它对任何其他程序集的所有引用都会立即解析。不仅如此:结果被缓存了(根据设计,自从我们发现 .NET 2.0 以来),这意味着我们根本没有机会尝试帮助 CLR。

如果不进一步详细说明我们尝试和学习的不同事物,基本上可以归结为我们遇到的这个问题:

为什么 ASP.NET 会像这样解析引用?它与其他类型的应用程序如何做到这一点不兼容,更重要的是,它没有根据 .NET/CLR 运行时的文档,指定对外部类型/程序集的引用将在第一次需要时解析(即当首先在代码中使用)。

任何形式的见解/想法将不胜感激!

0 投票
2 回答
1020 浏览

.net - .NET 4 加载不同于 .NET 3.5 的程序集

随着迁移到 .net 4,我们开始面临库的问题。假设我们有我们的库 MyLib.dll,它引用互操作程序集 Interop.dll。Interop.dll 引用了 MissingInterop.dll。

所以引用可以显示为:MyLib.dll -> Interop.dll -> MissingInterop.dll

在 MyLib.dll 中,我们仅使用来自 Interop.dll 的部分类,因此我们从不调用任何需要 MissingInterop.dll 的东西,而在 .net 3.5 中它工作得很好这就是我们不使用 MyLib.dll 发布 MissingInterop.dll 的原因。

当我们从在 .net 4 下运行的进程中使用 MyLib.dll 时,应用程序失败并出现以下异常:

FileNotFoundException:“无法加载文件或程序集'MissingInterop.dll,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null'或其依赖项之一。系统找不到指定的文件。”`

我还注意到 Interop.dll 引用了其他丢失的 dll,但 .net 不会尝试加载它们。我发现了不同之处。MissingInterop.dll 中的某些类型用于 Interop.dll 中的方法参数,而其他缺失库中的类型仅用作方法返回类型,即在 Interop.dll 中我可以看到:

.NET 4 尝试加载 MissingInterop.dll 但不尝试加载 AnotherMissingInterop.dll。

.NET 3.5 没有尝试加载 MissingInterop.dll 和 AnotherMissingInterop,因为它们没有在执行路径中使用。

我知道 .NET 4 有新的 Fusion,但我还没有发现任何地方描述的这种重大变化。有人知道为什么 .NET 4 会尝试加载不需要的东西吗?有没有办法在不重新编译代码或添加丢失文件的情况下解决这个问题?

0 投票
1 回答
2245 浏览

.net - ResolveEventArgs.RequestingAssembly 为 Null

我正在尝试通过反射动态加载程序集。我有这样的文件夹结构:

我可以使用反射加载someExtention 。在执行过程中出现问题someExtention寻找itsDependency。点网在 BIN 文件夹中查找。它在那里找不到。引发 Appdomain 的 AssemblyResolve 事件...

我正在捕捉这个事件。在 ResolveEventArgs 我得到需要加载的程序集的名称。问题是我没有得到RequestingAssembly。ResolveEventArgs 的该属性始终为空。我需要请求程序集,以便我可以直接查看它自己的 EXTN 文件夹。否则,我必须查看所有 EXTN 文件夹,在我的情况下,这些文件夹可能非常大。

RequestingAssembly 有一个属性 Location,根据这篇 msdn 文章,它包含物理文件的路径。本文还介绍了此属性可能为 Nothing 的情况。我不明白那里讨论的加载上下文。

任何帮助将是可观的......

0 投票
2 回答
9629 浏览

c# - 没有为依赖项触发 AssemblyResolve

我正在为 AssenblyResolve 事件苦苦挣扎一段时间。我搜索了 stackoverflow 并进行了其他谷歌搜索并尝试了所有我认为相关的内容。以下是更接近我的问题的链接(在我看来):

  1. 序列化期间未调用 AssemblyResolve 并引发 FileNotFoundException

  2. 在类库中哪里处理 AssemblyResolve 事件?

我有一个带有静态方法的 Bootstrapper 类(为了清楚起见,我将删除我们拥有的线程安全代码:

如果我有一个带有 main 方法和静态构造函数的简单类,我就能使代码工作。静态构造函数只是调用 Boostrapper.Initialize() 方法。之后,我可以使用我的库并且它按预期工作:

我遇到的问题是是否至少存在一层依赖关系。基本上代码保持不变,但这次我的库代码在另一个库中:

听起来我之前提到的链接中的#2 解释了我所看到的,但它不起作用。永远不会命中 AssemblyResove 回调上的 Visual Studio 断点。

知道发生了什么吗?

弗朗西斯

0 投票
1 回答
2813 浏览

c# - 使用 assemblyresolve 处理 C# 中缺少的程序集

我正在按照http://support.microsoft.com/kb/837908中的方法 3 在 C# 中动态加载程序集。但是,代码对我不起作用。在以下代码部分中,作者仅在缺失程序集的名称是应用程序引用的程序集之一时才加载缺失的程序集。

当我在调试下运行它时,该函数被调用,但缺少的程序集不在任何这些引用的程序集中,因此在我的情况下没有设置它。任何想法为什么会发生这种情况?我不确定该 DLL 是 C# 还是本机 C++。这可能是因为 C++ dll 无法以这种方式加载吗?那么,为什么会为缺少的 C++ 程序集调用此函数?任何解释表示赞赏。如果这不适用于从 C# 引用的 C++ 程序集,还有哪些替代方法?

0 投票
1 回答
593 浏览

c# - .NET assemblyResolve 事件处理程序是否进行版本验证

我有一些依赖于一些共享组件的应用程序。我正在将应用程序本地目录之外的这些共享程序集移动到共享目录。我的目标是每次发布新版本的共享程序集时,我只需将新版本放在共享目录中,而不必更改我的应用程序中的任何内容。我认为 assemblyResolve 事件是一个很好的解决方案。关于处理程序的工作方式,我有一个具体问题要问。

假设我附加此处理程序以解决共享目录中缺少的程序集。我只使用程序集名称在目录中查找相应的 dll 并使用 Assembly.LoadFrom(dllpath) 加载它。

我的应用程序引用程序集:名称:A,版本:1.0,公钥:... 程序集升级到版本:2.0 我将新程序集放在共享目录中。

应用程序会正确选择新版本吗?在加载新程序集并从处理程序返回后,C# 是否进行任何匹配?

根据我的测试,它工作正常。.NET 在注册从处理程序返回的程序集时会忽略版本。我只是想确保我没有错并且没有警告

谢谢

0 投票
1 回答
3680 浏览

c# - DLL 中的 ResolveEventHandler(类库)

在 C# 中,如果外部 dll 不在应用程序目录中,则有 ResolveEventHandler 事件来加载它们。

要在 winform 应用程序中使用它,我在 Program.cs Main() 函数中注册事件,如下所示:

然后是每次触发事件时都会调用的 ResolveAssembly 函数:

问题是如何在/从类库中添加/调用此事件?

我有一个类库(DLL),它有 3 个对外部 DLL 的引用。我不想将这些 dll 复制到应用程序目录中,也不想将它们放入应用程序的子目录中。这些 DLL 应保留在特定的外部文件夹中(因此使用事件)。

问题是我不知道在 DLL(类库)中将这个事件注册放在哪里: