0

私の問題は次のようになります。

というプロジェクトがありmyframeworkます。次のように、いくつかの拡張メソッドが定義されています。

namespace myframework
{
    public static class Helpers
    {
        public static bool ContainsAll(this string obj, string[])
        {
            return true;
        }
    }
}

また、インターフェースなどの他のものもあります。

System.CodeDom クラスを介して生成する 2 番目のクラスがあります。生成された出力は次のようになります。

using myframework;


public class A: IMyFrameworkInterface

{
    public void foo()
    {
        string s ="HELLO";

        if(s.ContainsAll(some_arr))
            return;
    }
        //More methods defined...

}

実際のコンパイル呼び出しの前に作成された私が渡すコンパイラ オプションは、正しいアセンブリを参照します

var cp = new CompilerParameters();
cp.ReferencedAssemblies.Add("System.dll");
cp.ReferencedAssemblies.Add("myframework.dll");

コード コンパイル モジュールは別のプロジェクトで作成されます。これを担当する特定のクラスは、コンパイルの結果を知ることができる CompilerError オブジェクトのリストへのアクセスも適切に提供します。

問題 1: asp.net プロジェクトでこれを試したところ、メタデータ ファイル myframework.dll が見つからないというエラーがコンパイラによってスローされました (プロジェクトで参照されているにもかかわらず)。

問題 2: Windows フォーム プロジェクトで試したとき。別のエラーが発生しました。今回は、文字列に ContainsAll() の定義が含まれていないと言っています

これら2つの特定の問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

少し掘り下げた後、これに対する答えを見つけました。.net フレームワーク 3.5 を使用していました。Codedom コンパイラ API は、デフォルトでフレームワークの v2.0 をターゲットにしています。したがって、正しいフレームワークを手動で指定する必要があります。

var cp = new CompilerParameters(
    new Dictionary<string,string>() { {"CompilerVersion", "v3.5"} });

コンパイルがasp.net環境内で機能するためには、実際に参照を正しい場所に向ける必要があります。したがって、次のようなことを行う必要があります。

cp.ReferencedAssemblies.Add(
    HttpContext.Current.Server.MapPath(
        "bin\\myframework.dll"));

私の参照:

  1. http://blogs.msdn.com/b/lukeh/archive/2007/07/11/c-3-0-and-codedom.aspx
  2. .Net 3.5 CodeDom コンパイラで奇妙なエラーが発生する
  3. そして、質問の投稿へのコメント。:)
于 2013-05-31T03:50:18.127 に答える