Tag: assembly.load

从特定路径加载强名称程序集?

我有一个强名称程序集,安装到特定文件夹(而不是GAC)。 Reflector中显示的名称是: “Foo.Bar.TreeFrog, Version=1.2.1.0, Culture=neutral, PublicKeyToken=ac88c4a8b22089b4” 以及安装它的路径 “c:\\QueueBall” 我可以使用Assembly.Load或Assembly.LoadFrom加载它,如果是这样,怎么办? 我能否确保强大的命名得到尊重,即我正在加载的DLL真的是我期待的那个而不是同名的冒名顶替者?

如何提供后备程序集而不是无法加载的程序集?

在运行时,如果引用的程序集无法加载,例如“强名称validation失败”(因为它是经过测试签名的),是否有办法从另一个实际签名的路径提供替换程序集? 我尝试订阅AppDomain.CurrentDomain.AssemblyResolve,但它没有被触发,因为“坏”程序集技术上存在,它只是无法加载。 当无法加载程序集时,是否有通用的方法来提供回退程序集?

如何以编程方式运行NUnit

我有一些引用NUnit的程序集,并使用单个测试方法创建一个测试类。 我能够获得此程序集的文件系统路径(例如“C:… \ test.dll”)。 我想以编程方式使用NUnit来运行此程序集。 到目前为止我有: var runner = new SimpleTestRunner(); runner.Load(path); var result = runner.Run(NullListener.NULL); 但是,调用runner.Load(path)会抛出FileNotFoundexception。 我可以通过堆栈跟踪看到问题是NUnit在堆栈中调用Assembly.Load(path)。 如果我将路径更改为“Test,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null”,那么我仍会得到相同的错误。 我已经向AppDomain.Current.AssemblyResolve添加了一个事件处理程序,以查看我是否可以手动解析此类型,但我的处理程序永远不会被调用。 让Assembly.Load(…)工作的秘诀是什么?

在没有AppDomains的情况下运行时重新编译C#

假设我有两个C#应用程序 – game.exe (XNA,需要支持Xbox 360)和editor.exe (在WinForms中托管的XNA) – 它们共享一个engine.dll程序集,完成绝大部分工作。 现在让我们说我想添加某种基于C#的脚本(它不是“脚本”,但我会称之为)。 每个级别都有自己inheritance自基类的类(我们称之为LevelController )。 这些是这些脚本的重要约束: 它们需要是真实的,编译好的C#代码 他们应该需要最少的手动“粘合”工作,如果有的话 它们必须与其他所有内容在同一AppDomain中运行 对于游戏 – 这非常简单:所有脚本类都可以编译成程序集(比如, levels.dll ),并且可以根据需要使用reflection对各个类进行实例化。 编辑要困难得多。 编辑器能够在编辑器窗口中“玩游戏”,然后将所有内容重置回原来的位置(这就是编辑器首先需要了解这些脚本的原因)。 我想要实现的基本上是编辑器中的“重新加载脚本”按钮,它将重新编译并加载与正在编辑的级别相关联的脚本类,并且当用户按下“播放”按钮时,创建最近的实例编译脚本。 其结果将是编辑器中的快速编辑测试工作流程(而不是替代方案 – 保存级别,关闭编辑器,重新编译解决方案,启动编辑器,加载级别,测试)。 现在我想我已经找到了实现这一目标的潜在方法 – 这本身就会产生一些问题(如下所示): 将给定级别(或者,如果需要,整个levels.dll项目)所需的.cs文件集合编译为临时的,唯一命名的程序集。 该程序集将需要引用engine.dll 。 如何在运行时以这种方式调用编译器? 如何让它输出这样的程序集(我可以在内存中执行)吗? 加载新assembly。 我在同一个进程中加载​​具有相同名称的类是否重要? (我的印象是名称是由程序集名称限定的?) 现在,正如我所提到的,我无法使用AppDomains。 但是,另一方面,我不介意泄漏旧版本的脚本类,因此卸载的能力并不重要。 除非是吗? 我假设加载可能几百个组件是可行的。 在播放关卡时,实例是从刚刚加载的特定程序集inheritance自LevelController的类。 这该怎么做? 最后: 这是一种明智的做法吗? 它可以做得更好吗? 更新:这些天我使用一种更简单的方法来解决潜在的问题。