0

私が達成しようとしているのは、私が生成した 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);

助けていただければ幸いです。

4

2 に答える 2

0

「System.dll」と「System.ComponentModel.DataAnnotations.dll」(System.ComponentModel のもの) への参照も追加しようとしましたか? (実際にアセンブリ参照が欠落している可能性があるため)

options.ReferencedAssemblies.Add(
    Path.Combine(
  Directory.GetCurrentDirectory(),
    "System.ComponentModel.DataAnnotations.dll"));
于 2016-04-22T14:38:02.257 に答える
0

(エラーが示すように)必要なすべてのアセンブリを参照する必要があるため、少なくとも次のように追加する必要があります。

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

他にも必要かもしれません

あなたの質問のコメントについて、はい、指定する必要がありますoptions.OutputAssembly

また、生成されたコードで:

using System.ComponentModel.DataAnnotations.KeyAttribute;

KeyAttributeは名前空間ではないため、コンパイル時にエラーが発生する可能性があります。

名前空間のusings 前にも取ります。これは厳密には必要ではなく、エラーでもありませんが、一般的な方法です (そのようにして、参照されるアセンブリがglobal名前空間からのものであり、クラスが存在する名前空間の子ではないことを確認します [名前の競合がある場合に備えて])

于 2016-04-22T14:26:23.927 に答える