【问题标题】:How can I dynamically include assemblies when dynamically compiling code?动态编译代码时如何动态包含程序集?
【发布时间】:2014-12-23 12:12:10
【问题描述】:

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

【问题讨论】:

  • 我认为您需要提供一些有关您如何执行此编译的信息,以便任何人都能够回答您的问题。

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


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我如何通过只知道程序集名称来获得这个完全限定的程序集名称?
  • 问题是这些程序集实际上并不存在于我的项目中。它们被引用到我的 C:\Referenced Assemblies\...\.NETFramework (.NET 程序集所在的位置)中某处的文件夹。但是这个文件夹在另一台电脑上可能不一样,所以我不能使用文件路径
猜你喜欢
  • 2011-09-03
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 2013-10-17
  • 1970-01-01
  • 2013-08-24
  • 2016-08-31
  • 1970-01-01
相关资源
最近更新 更多