2

如何将程序集加载到内存并使用它们的名称实例化其中一种类型?

我有这个要编译:

    /// <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);
    }

然后,我尝试使用它来实例化上面代码在内存中生成的成员:

    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' 或其依赖项之一。该系统找不到指定的文件。

程序集名称正确。可能是什么?

提前致谢。

4

1 回答 1

4

根据 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 属性的值。

于 2013-03-17T12:01:40.517 回答