在内存中编译并创建内存程序集类型的实例
本文关键字:内存 类型 实例 程序集 编译 创建 | 更新日期: 2023-09-27 18:04:13
如何将程序集加载到内存中并通过使用其名称来实例化其类型之一?
我有这个编译:
/// <summary>
/// Compiles the input string and saves it in memory
/// </summary>
/// <param name="source"></param>
/// <param name="referencedAssemblies"></param>
/// <returns></returns>
public static CompilerResults LoadScriptsToMemory(string source, List<string> referencedAssemblies)
{
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
parameters.GenerateExecutable = false;
parameters.IncludeDebugInformation = false;
//Add the required assemblies
foreach (string reference in referencedAssemblies)
parameters.ReferencedAssemblies.Add(reference);
foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
{
if (asm.Location.Contains("Microsoft.Xna") || asm.Location.Contains("Gibbo.Library")
|| asm.Location.Contains("System"))
{
parameters.ReferencedAssemblies.Add(asm.Location);
}
}
return Compile(parameters, source);
}
/// <summary>
/// Compiles a source file with the given parameters and source
/// </summary>
/// <param name="parms"></param>
/// <param name="source"></param>
/// <returns></returns>
private static CompilerResults Compile(CompilerParameters parameters, string source)
{
CodeDomProvider compiler = CSharpCodeProvider.CreateProvider("CSharp");
return compiler.CompileAssemblyFromSource(parameters, source);
}
然后,我尝试使用this来实例化上面代码在内存中生成的一个成员:
var handler = Activator.CreateInstance(SceneManager.ScriptsAssembly.FullName, name);
ObjectComponent oc = (ObjectComponent)handler.Unwrap();
SceneManager.ScriptsAssembly。FullName:>我保存编译后的程序集在SceneManager.ScriptsAssembly.
name:>我要加载的类型的名称
我得到这个错误:
错误加载场景:无法加载文件或程序集'nhvneezw, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'或其依赖项之一。系统找不到指定的文件
程序集名称正确。会是什么呢?
根据MSDN (http://msdn.microsoft.com/en-US/library/system.codedom.compiler.compilerresults.compiledassembly.aspx)
CompiledAssembly属性的get访问器调用Load方法将编译后的程序集加载到当前应用程序域
您可以使用Assembly.CreateInstance(http://msdn.microsoft.com/en-US/library/dex1ss7c.aspx)方法代替Activator。如果您只需要通过类型名称创建实例,则必须获取CompilerResults的值。CompiledAssembly财产。