【发布时间】:2011-09-03 13:36:18
【问题描述】:
我在一个 .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());
如果我不使用插件中的任何类,这将有效。
【问题讨论】:
-
当内存中的程序集执行时(并且应该调用引用的 dll)没有抛出异常但代码没有同时执行?肯定有某事正在发生...
-
你能提供一些你用来加载插件 dll 的代码吗?
-
我添加了一些关于如何加载插件以及如何指定对编译器的引用的代码。
标签: c# .net compilation dynamic