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

问题描述

| 我在.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());
如果我不使用插件中的任何类,则此方法有效。     

解决方法

        我发现了问题,并且问题出在其他区域,这部分工作正常。 @Insipid-感谢您的启发性回答,因为实际上什么都没发生,这就是让我看看另一个地方并看到问题的原因。 我上面粘贴的代码效果很好,如果将来有人想要实现这种机制,可以使用它。