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

C# 在动态编译的代码中引用动态加载的程序集,c#,.net,compilation,dynamic,C#,.net,Compilation,Dynamic,在一个.net项目中,我遇到了这样一种情况:我正在使用CodeDomProvider将C#脚本编译到内存程序集中 在我用于编译的CompilerParameters类中,我按标题引用了一些程序集(System.dll和项目的一部分),到目前为止一切正常。但是,有些脚本使用的代码(通过接口和多态性)是在预编译但从磁盘(如插件)动态加载的程序集中找到的。在这种情况下,它将不起作用,问题是在动态编译脚本时,我不知道如何引用动态加载的程序集 如果我将脚本放在类库中,并从该类库中引用插件程序集,则一切正常

在一个.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());
CodeDomProvider provider=CodeDomProvider.CreateProvider(“CSharp”);
列表引用集合=新列表();
referenceAssemblies.Add(“System.dll”);
referenceAssemblies.Add(“VFS.dll”);
foreach(PluginManager.Instance.Assemblies中的程序集asm)
{
referenceAssemblies.Add(asm.Location);
}
CompilerParameters CompilerParameters=新的CompilerParameters(referenceAssemblies.ToArray());

如果我不使用插件中的任何类,这一点就行了。

我发现了问题所在,它位于不同的区域,这一部分工作正常

@平淡无奇-谢谢你鼓舞人心的回答,因为实际上什么都没有发生,而这正是让我去另一个地方看问题的原因


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

当内存中的程序集执行(并假定调用引用的dll)时,不会抛出异常,但不会同时执行代码?确实发生了一些事情…你能给一些你用来加载插件dll的代码吗?我已经添加了一些关于如何加载插件以及如何指定对编译器的引用的代码。