我试图创建一个类似于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应该因为这个原因而被拆分,不是吗?
答案 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}}“复制如果更新”。