问题标签 [assembly.load]

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 投票
2 回答
13031 浏览

c# - 如何以编程方式运行 NUnit

我有一些引用 NUnit 并使用单个测试方法创建单个测试类的程序集。我能够获得该程序集的文件系统路径(例如“C:...\test.dll”)。我想以编程方式使用 NUnit 来针对这个程序集运行。

到目前为止,我有:

但是,调用 runner.Load(path) 会引发 FileNotFound 异常。我可以通过堆栈跟踪看到问题在于 NUnit 在堆栈中调用 Assembly.Load(path) 。如果我将路径更改为“Test,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”,那么我仍然会收到相同的错误。

我已向 AppDomain.Current.AssemblyResolve 添加了一个事件处理程序,以查看是否可以手动解析此类型,但我的处理程序永远不会被调用。

让 Assembly.Load(...) 工作的秘诀是什么?

0 投票
5 回答
34325 浏览

c# - C# Assembly.Load 与 Assembly.ReflectionOnlyLoad

我试图了解 Assembly.Load 和 Assembly.ReflectionOnlyLoad 之间的区别。

在下面的代码中,我试图查找给定程序集中从给定接口继承的所有对象:

这段代码对我来说很好,但我正在研究其他可能更好的替代方案,并遇到了 Assembly.ReflectionOnlyLoad() 方法。

我假设由于我没有加载或执行任何对象,基本上只是查询它们的定义,我可以使用 ReflectionOnlyLoad 来稍微提高性能......

但事实证明,当我将 Assembly.Load 更改为 Assembly.ReflectionOnlyLoad 时,它调用 assembly.GetTypes() 时出现以下错误:

无法加载一种或多种请求的类型。检索 LoaderExceptions 属性以获取更多信息。

我假设上面的代码只是在做反射和“查看”库......但这是否是海森堡不确定性原则的某种实例,即查看库和其中的对象实际上是试图在某些情况下实例化它们方式?

谢谢,马克斯

0 投票
2 回答
2399 浏览

c# - C# assembly.load from a byte[] 问题

我有一个 EXE 加载到一个字节数组中,我正在尝试使用 Assembly.Load 将它加载到一个程序集对象中。我在尝试加载时遇到错误。

这是导致异常的代码:

bin 是我的字节数组,从 EXE 加载。

这是我得到的例外:

无法加载文件或程序集“从 calc_tester 加载的 109590 字节,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null”或其依赖项之一。试图加载格式不正确的程序。

任何帮助表示赞赏。

0 投票
5 回答
2399 浏览

c# - .NET 中的程序集绑定问题

我正在编写一个 .NET 库,由于各种原因无法在 GAC 中注册。这个 dll(我们称之为 SDK.dll)依赖于其他 DLL 才能被加载。

在编写使用此 SDK.dll 的程序时,我注意到我的程序无法加载 dll 并引发 FileNotFoundException。发生这种情况是因为虽然我能够找到引用的 SDK.dll,但 CLR 未能加载其依赖项。

我发现解决问题的唯一方法是“复制本地”SDK.dll 及其所有依赖项(由于部署问题我不能这样做),或者将我的程序编译到与 SDK.dll 相同的目录中

有没有办法告诉 SDK.dll 在哪里寻找它的依赖项而不管它的位置?也许 SDK.dll.config 文件可以提供帮助?

0 投票
1 回答
810 浏览

reflection - 仅加载一次程序集

我在运行时加载程序集,每次调用代码时出现的问题是我是否应该检查该特定程序集是否已经加载?还是.Net 会处理这个问题并且一个程序集(相同版本)只能加载一次?这里的基本问题是我是否必须遍历已加载程序集的列表并查看我的程序集是否已加载?谢谢

0 投票
2 回答
2139 浏览

.net - 使用 Assembly.LoadFrom 和 Assembly.Load 混合加载程序集时的奇怪行为

Assembly.LoadFrom使用和混合加载程序集时的奇怪行为Assembly.Load

Assembly.LoadFrom我在加载程序集时遇到了一个奇怪的行为Assembly.Load。我正在使用 加载程序集Assembly.LoadFrom,其中程序集位于一个文件夹中,该文件夹不是执行文件夹。

稍后在我的测试代码中,当我尝试使用 再次加载此程序集时Assembly.Load,尽管程序集已加载,但加载失败并显示System.IO.FileNotFoundException(“无法加载文件或程序集...”)。使用强名称和非强名称加载都失败(再次加载此程序集的最初原因是使用 a BinaryFormatter)。

但是,如果程序集位于执行文件夹中,则以后的加载在两种情况下都会成功,使用强名称和非强名称。在这种情况下,您可以看到从两个不同的位置加载了两个相同的程序集。

重现此问题的简单代码示例:

  1. 任何解释为什么 CLR 忽略已加载的程序集?
  2. 知道如何缓解这个问题吗?
0 投票
3 回答
2195 浏览

c# - 如何加载引用 Win32 DLL 的程序集?

我正在开发一个使用反射加载插件的 .NET 应用程序。我的插件是 C# 类库。问题是我的一些插件引用了传统的 Win32 DLL,而 C# 盲目地尝试加载依赖项,就好像它们是 .NET DLL 一样。

这是我加载插件的方式:

我收到System.BadImageFormatException以下消息:

如何以编程方式加载引用 Win32 DLL 的程序集?

0 投票
4 回答
6854 浏览

c# - 运行时重新编译 C#,不使用 AppDomains

假设我有两个 C# 应用程序—— game.exe(XNA,需要支持 Xbox 360)和editor.exe(XNA 托管在 WinForms 中)——它们都共享一个engine.dll程序集来完成大部分工作。

现在假设我想添加某种基于 C# 的脚本(它不完全是“脚本”,但我会这么称呼它)。每个级别都有自己的类继承自一个基类(我们称之为LevelController)。

这些是这些脚本的重要约束:

  1. 它们需要是真实的、经过编译的 C# 代码

  2. 他们应该需要最少的手动“胶水”工作,如果有的话

  3. 它们必须和其他所有东西在同一个 AppDomain 中运行

对于游戏 - 这非常简单:所有脚本类都可以编译成一个程序集(例如,levels.dll),并且可以根据需要使用反射来实例化各个类。

编辑器更难。编辑器能够在编辑器窗口中“玩游戏”,然后将所有内容重置回它开始的位置(这就是为什么编辑器首先需要了解这些脚本的原因)。

我想要实现的基本上是编辑器中的“重新加载脚本”按钮,它将重新编译和加载与正在编辑的关卡关联的脚本类,当用户按下“播放”按钮时,创建一个最近的实例编译好的脚本。

其结果将是编辑器内的快速编辑测试工作流程(而不是替代方案 - 保存关卡、关闭编辑器、重新编译解决方案、启动编辑器、加载关卡、测试)。


现在我我已经找到了一种可能的方法来实现这一点——这本身就会导致一些问题(如下所示):

  1. .cs将给定级别(或者,如果需要,整个项目)所需的文件集合编译levels.dll成一个临时的、唯一命名的程序集。该程序集将需要引用engine.dll. 如何在运行时以这种方式调用编译器?如何让它输出这样的程序集(我可以在内存中完成)?

  2. 加载新程序集。将具有相同名称的类加载到同一进程中是否重要?(我的印象是名称由程序集名称限定?)

    现在,正如我所提到的,我不能使用 AppDomains。但是,另一方面,我不介意泄露旧版本的脚本类,因此卸载能力并不重要。除非是?我假设加载可能几百个程序集是可行的。

  3. 播放关卡时,实例化从刚刚加载的特定程序集继承自 LevelController 的类。这该怎么做?

最后:

这是一个明智的做法吗?可以做得更好吗?


更新:这些天我使用一种更简单的方法来解决根本问题。

0 投票
4 回答
880 浏览

c# - 如何提供备用程序集而不是无法加载的程序集?

在运行时,如果引用的程序集无法加载,例如“强名称验证失败”(因为它是测试签名的),有没有办法从另一个真正签名的路径提供替换程序集?

我尝试订阅 AppDomain.CurrentDomain.AssemblyResolve,但它没有被解雇,因为技术上存在“坏”程序集,它只是无法加载。

当无法加载程序集时,是否有一种通用方法来提供后备程序集?

0 投票
2 回答
953 浏览

.net - 使用 XCOPY 部署动态加载程序集及其依赖项

我有一个动态加载应用程序的应用程序加载器。应用程序是一个程序集,其所有依赖项都位于一个文件夹中。使用 XCOPY 部署,我可以通过复制/删除文件夹来添加/删除应用程序。为了便于标准的 .NET 程序集绑定,我将应用程序文件夹复制到加载程序的 bin 下。我在配置文件中设置了探测 privatePath,一切都像一个魅力。

应用程序使用框架,即共享程序集作为依赖项。

现在我有一个要求,即每个应用程序都必须能够使用自己的框架版本。

当我在 GAC 中安装框架版本时,这完美地工作,并且程序集的不同版本被加载到默认的 AppDomain 中就好了。

现在我想回到我的 XCOPY 解决方案,并将正确的框架版本复制到其相应的应用程序文件夹中,然后解决方案就会中断。

第一个引用其框架的应用程序工作正常,第二个应用程序抱怨找不到程序集并且清单不匹配。

就好像 .NET 加载程序在第一次与“privatePath”中的文件夹匹配后停止探测并且不再查看。

关于如何具有与使用 GAC 时相同的行为的任何想法?还有什么我可以在配置代码库中指定的吗?(请不要绝对文件路径)。

克鲁,米歇尔