在动态编译代码时如何动态包含程序集?

时间:2014-12-23 12:12:11

标签: c# .net winforms .net-assembly dynamic-compilation

我有一个应用程序,我在其中编译C#代码并在运行时启动输出。到目前为止,这一切都很顺利,但现在我正在尝试编译WinForms应用程序,我在引用的程序集中遇到了麻烦。

WinForms项目的整个项目文件夹都在我的应用程序中,因此我通过将.csproj文件作为XML文件读取来检索所有引用的程序集。 所以我将引用的程序集的名称作为字符串,例如:

System
Microsoft.CSharp
System.Drawing
System.Windows.Forms            etc.

是否可以在运行时加载这些程序集而只知道这些名称?我知道他们在我的系统上的位置路径,但应用程序也应该在别人的机器上正确运行。

更新

编译如下:从类文件中以字符串格式检索类中的代码,这些代码都存储在数组中。然后将该数组传递给CSharpCodeProvider编译器。应用程序只与控制台程序一起工作,但只要有引用的程序集(例如在WinForms中),我当然也必须编译这些程序集。

所以我要做的是从项目中获取所有程序集,然后加载它们,以便在执行时不会丢失程序集错误。

我目前的代码是这样的:

var assemblies = AppDomain.CurrentDomain
                        .GetAssemblies()
                        .Where(a => !a.IsDynamic)
                        .Select(a => a.Location);
        parameters.ReferencedAssemblies.AddRange(assemblies.ToArray()); //parameters is CompilerParameters

这有效,但不是很好的工作方式,因为它只是添加了Visual Studio中所有引用的程序集(当然这对每台机器都不起作用)。

1 个答案:

答案 0 :(得分:0)

您必须提供有效的完全限定程序集名称:

var assembly = Assembly.Load( @"System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" );

您可以通过提供程序集路径来获取程序集名称:

AssemblyName.GetAssemblyName(@".\UtilityLibrary.dll")

所以你有两个选择。按文件路径指定版本或加载特定程序集