1

我有一个应用程序,我在其中编译 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 中添加所有引用的程序集(这当然不适用于每台机器)。

4

1 回答 1

0

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

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

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

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

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

于 2014-12-23T12:28:57.037 回答