使用ReferencedAssemblies时的C#程序集路径问题

时间:2015-02-15 15:00:38

标签: c# codedom

我试图创建一个类似于Unity的工具(显然规模较小),我需要能够编译在编辑器和最终游戏中都有效的脚本。

我的方法是使用我的游戏可执行文件的ReferencedAssembly编译编辑器中的代码,而游戏可执行文件已包含编译时存在的所有脚本。

但是我的编辑部分有问题。基本上我设置

parameters.ReferencedAssemblies.Add ("path/to/Game.exe");
parameters.GenerateInMemory=true;
parameters.GenerateExecutable=false;

然后编译。没有编译错误,但在尝试使用

var typeArray=results.CompiledAssembly.GetTypes();

抛出ReflectionTypeLoadException异常:

Could not load file or assembly 'Game, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies.

但是,将我的可执行Game.exe复制到工具的目录,并将引用程序集更改为

parameters.ReferencedAssemblies.Add ("Game.exe");

允许我编译和访问GetTypes而不会出错。

所以,我的问题是:

a)如何在使用另一个目录中的程序集时使GetTypes工作? (注意:我不想添加GAC的路径,因为它应该是一个通用工具)

b)是否可以在不加载引用的程序集的情况下访问类型信息?我的意思是,在.NET 4.5中Type和TypeInfo应该因为这个原因而被拆分,不是吗?

1 个答案:

答案 0 :(得分:1)

关于你的观点 a)“当使用另一个目录中的程序集时,如何使GetTypes正常工作?

我认为你可以使用Assembly.LoadFrom Method (String)从另一个目录加载程序集。

关于您的观点 b)“是否可以在不加载引用的程序集的情况下访问类型信息?”

我不确定您是否能够以某种方式加载类型信息,但是您知道loading Assemblies into the Reflection-Only Context吗?

  

仅反射加载上下文允许您检查为其他平台或其他版本的.NET Framework编译的程序集。加载到此上下文中的代码只能被检查;它无法执行。这意味着无法创建对象,因为无法执行构造函数。由于无法执行代码,因此不会自动加载依赖项。如果您需要检查它们,您必须自己加载它们。

在您的问题的第二次阅读中,“game.exe”如何在您的项目文件中被引用?

如果是MSBuild需要将其复制到项目的构建输出文件夹的情况,可以将“game.exe”添加为项目中的项目,将build action设置为“None”和{ {3}}“复制如果更新”。