gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:41:57 29 4
gpt4 key购买 nike

我在 .net 项目中遇到这样一种情况,在该项目中,我使用 CodeDomProvider 将 C# 脚本编译到内存程序集中。

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

如果我将我的脚本放在一个类库中,并从该类库中引用插件程序集,一切正常,但是如果我将插件程序集(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 - 感谢您鼓舞人心的回答,因为什么实际上都没有发生,这让我转向另一个地方并看到了问题。

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

关于c# - 在动态编译的代码中引用动态加载的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6155406/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com