在动态编译的代码中引用动态加载的程序集

时间:2011-05-27 16:54:00

标签: c# .net compilation dynamic

我在.net项目中有一种情况,我在其中使用CodeDomProvider将C#脚本编译为内存中的程序集。

在我用于编译的CompilerParameters类中,我按标题引用了一些程序集(System.dll和属于项目的一部分),到目前为止一切正常。但是,有些脚本正在使用一些代码(通过接口和多态),这些代码可以在预编译但从磁盘动态加载的程序集中找到(如插件)。在这种情况下它将无法工作,问题是我不知道如何动态编译脚本时引用动态加载的程序集。

如果我将我的脚本放在类库中并从该类库中引用插件程序集,它一切正常,但如果我将插件程序集的名称(dll文件)添加到引用CompilerParameters中的程序集然后动态编译脚本,脚本被执行但是插件dll中的代码却没有。

我希望我很清楚我在这里要做什么,如果你对此有所了解,请提供帮助,因为我现在已经挣扎了一段时间,而且我没有尝试过的任何工作。

谢谢!

编辑:以下是加载插件dll的代码:

        DirectoryInfo di = new DirectoryInfo(@".\Plugins");
        FileInfo[] files = di.GetFiles("*.dll");
        foreach (FileInfo fi in files)
        {
            try
            {
                //load all dll files from the app pack directory
                Assembly asm = Assembly.LoadFrom(fi.FullName);
                Assemblies.Add(asm);
                foreach (Type type in asm.GetTypes())
                {
                    try
                    {
                        object instance = null;
                        instance = Activator.CreateInstance(type);

在此之后,我将实例存储在字典中以供进一步使用。另一方面,以下是我尝试将引用传递给将要编译的脚本:

        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        List<string> referenceAssemblies = new List<string>();
        referenceAssemblies.Add("System.dll");
        referenceAssemblies.Add("VFS.dll");
        foreach (Assembly asm in PluginManager.Instance.Assemblies)
        {
            referenceAssemblies.Add(asm.Location);
        }
        CompilerParameters compilerParameters = new CompilerParameters(referenceAssemblies.ToArray());

如果我不使用属于插件的任何类,则此方法有效。

1 个答案:

答案 0 :(得分:0)

我发现了这个问题并且它在不同的区域,这部分工作正常。

@Insipid - 感谢您的鼓舞人心的答案,因为没有实际发生,这就是让我看到另一个地方并看到问题的原因。

我上面粘贴的代码工作得很好,如果有人想在将来实现这样的机制,可以使用。