0

vs の私のソリューション構造は次のとおりです。

  • MyRuleEngineFramework
  • ルールエディター

MyRuleEngineFramework はクラス ライブラリです。RulesEditor は winforms プロジェクトです。後者は前者を参照していますが、そのアセンブリはエディター プロジェクト内のどこにも使用されません。

ある種の参照を行うコードは数行だけです。

CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("MyRuleEngineFramework.dll");
cp.OutputAssembly = "temp.dll";
cp.GenerateInMemory = false;
CompilerResults cr = provider.CompileAssemblyFromSource(cp, SourceCode);

上記のコードは正常に実行され、コンパイルされたアセンブリを初めて取得しました。

次に、MyRuleEngineFramework.dll を gac に登録しました。

この後、生成されたコード ( SourceCode) はコンパイルされませんでした。次に、エディター プロジェクトで dll への参照を削除しましたが (アセンブリがまだ Gac にある間)、コンパイルされませんでした。

なぜこれが起こるのですか?

4

1 に答える 1

2

コンパイラには参照アセンブリが必要です。これはGACに保存しないでください。GAC は、コンパイル時に使用した参照アセンブリの適切なバージョンを CLR が見つけられるようにするためだけに存在します。したがって、コンパイラは GAC で参照アセンブリを探すことはありません。また、どのバージョンを探すべきかわかりません。

そのため、アセンブリを GAC に追加したときに、これはうまくいきませんでした。ビルド システムは、DLL を出力ディレクトリにコピーする必要がなくなったことを認識できるようになったため、DLL を出力ディレクトリにコピーしなくなりました。したがって、参照アセンブリが見つからず、コンパイラがそれを見つけることができないため、CodeDom コードは機能しなくなります。

開発マシンで GAC を使用しないでください。プログラムをインストールしたマシン上のみ。特定のケースでは、コンパイルするアセンブリがコードの実行時にロードされるアセンブリと同一であることに依存しているため、決してそうすべきではありません。

于 2013-05-12T12:44:08.273 に答える