从文件编译程序集时找不到命名空间错误



我试图实现的是从我生成的 C# 类动态生成一个项目。此类的内容与实体框架的代码优先代码生成内容类似。内容如下所示:

namespace ElasticTables
{
    using System;
    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    using System.ComponentModel.DataAnnotations.Schema;
    using System.ComponentModel.DataAnnotations.KeyAttribute;
    [Table("address")]
    public partial class address
    {
        [Key]
        public decimal id { get; set; }
        public string name { get; set; }
    }
}

我从数据库中的表生成此文件,然后尝试以编程方式编译它,以便我可以在使用 API 的另一个项目中引用生成的项目。

编译时的主要错误是:

类型或命名空间名称"KeyAttribute"在命名空间"System.ComponentModel.DataAnnotations"中不存在(是否缺少程序集引用?

找不到类型或命名空间"密钥"

找不到类型或命名空间"表"。

我正在使用"CSharpCodeProvider"

    var provider = new CSharpCodeProvider();
    var options  = new CompilerParameters
    {
        OutputAssembly  = "ElasticTables.dll",
        CompilerOptions = "/optimize"
    };

我有以下引用的程序集

options.ReferencedAssemblies.Add(Directory.GetCurrentDirectory() + "\EntityFramework.dll");
options.ReferencedAssemblies.Add(Directory.GetCurrentDirectory() + "\EntityFramework.SqlServer.dll");

有一个字符串数组,其中包含称为源的文件路径,我尝试使用以下行进行编译

CompilerResults results = provider.CompileAssemblyFromFile(options, sources);

非常感谢帮助。

您需要引用所有需要的程序集(如错误所述),因此您需要添加,我至少要说:

options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("System.ComponentModel.DataAnnotations.dll");

可能需要其他

关于您问题中的评论,是的,您应该指定options.OutputAssembly

此外,在生成的代码中:

using System.ComponentModel.DataAnnotations.KeyAttribute;

KeyAttribute不是命名空间,因此在编译时可能会出错。

我也会在命名空间之前获取usings。这不是绝对需要的,也不是错误,但这是常见的做法(这样您就可以确定引用的程序集来自 global 命名空间,而不是您的类所在的命名空间的子级 [以防万一存在名称冲突])

您是否尝试添加对"System.dll"和"System.ComponentModel.DataAnnotations.dll"的引用(用于System.ComponentModel的东西)?(因为您可能确实缺少程序集引用)

options.ReferencedAssemblies.Add(
    Path.Combine(
  Directory.GetCurrentDirectory(),
    "System.ComponentModel.DataAnnotations.dll"));

相关内容

  • 没有找到相关文章

最新更新