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

本文关键字:动态 加载 程序集 引用 代码 编译 | 更新日期: 2023-09-27 17:57:46

在.net项目中,我使用CodeDomProvider将C#脚本编译到内存中的程序集。

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

如果我把脚本放在类库中,并从该类库引用插件程序集,一切都很好,但如果我把插件程序集的名称(dll文件)添加到CompilerParameters中引用的程序集中,然后动态编译脚本,则会执行脚本,但插件dll中的代码不会。

我希望我在这里想做的事情很清楚,如果你对此有所了解,请帮忙,因为我已经挣扎了一段时间,我尝试过的都不起作用。

谢谢!

编辑:这是加载插件dlls:的代码

        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-感谢你鼓舞人心的回答,因为实际上什么都没有发生,这让我看到了另一个地方,看到了这个问题。

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