1

以下を使用して、実行時にメソッドを生成しています。

System.Reflection.Assembly currentAssembly = System.Reflection.Assembly.GetExecutingAssembly();
System.CodeDom.Compiler.CompilerParameters compilerParams = new System.CodeDom.Compiler.CompilerParameters();
compilerParams.GenerateExecutable = false;
compilerParams.GenerateInMemory = true;
compilerParams.ReferencedAssemblies.Add(currentAssembly.Location);
System.CodeDom.Compiler.CodeDomProvider provider = System.CodeDom.Compiler.CodeDomProvider.CreateProvider("C#");
System.CodeDom.Compiler.CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, code);
System.Reflection.Assembly newAssembly = results.CompiledAssembly;
newAssembly.GetType("NewOut.NewClass").GetMethod("newMethod").Invoke(null, args);

「コード」文字列を受け取り、通常は正常に動作します。ただし、動的に生成されたコードの一部は明らかにコンパイルを拒否し、CompiledAssembly にアクセスするとこの例外をスローします。

「ファイルまたはアセンブリ 'file:///C:\Documents and Settings\Dan\Local Settings\Temp\tkitti7h.dll' またはその依存関係の 1 つを読み込めませんでした。指定されたファイルが見つかりません。」

コードはコンパイルする必要があります。

このコードはコンパイルされ、正常に動作します。

using Environment;

namespace NewOut{
public class NewClass{
    public NewClass(){
    }
    public static void newMethod(Color[,] data){
        int width = data.GetLength(0); int height = data.GetLength(1); for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ Color brighter = data[x, y].brighten(0.4f).setRed(127); data[x, y] = brighter.toward(new Color("gray", 0.5), 0.5f); } }
    }
}
}

別の Color コンストラクターを呼び出すことを除いて、この別の点では同一のコードは、例外をスローします。

using Environment;

namespace NewOut{
public class NewClass{
    public NewClass(){
    }
    public static void newMethod(Color[,] data){
        int width = data.GetLength(0); int height = data.GetLength(1); for(int x = 0; x < width; x++){ for(int y = 0; y < height; y++){ Color brighter = data[x, y].brighten(0.4f).setRed(127); data[x, y] = brighter.toward(new Color("gray"), 0.5f); } }
    }
}
}

明らかに、その動的に生成されたコードを実際の cs ファイルに貼り付けると、コンパイルして正常に実行されます。その単一引数のコンストラクターには何の問題もありません。

もちろん、私はグーグルで検索しましたが、例外自体は一般的であり、dll のキャッシュなどに関係していますが、実際に動的に呼び出されたコンパイラが何を訴えているのかを表示する方法を見つけることができませんでした。動的に生成されたコードに実際の問題がないことは明らかなので、その場でコンパイル エラーを確認する必要があります。

では、実際のエラーを表示するにはどうすればよいですか?

Color(string) コンストラクターに加えて、文字列から Color への暗黙的な変換も、動的にコンパイルされたコードで使用しようとすると CompiledAssembly 例外をスローすることに注意してください。特に過去に、C# コンパイラが理由もなく暗黙的な文字列から色への変換を呼び出す傾向があることに気づいたので (最適化の誤り?)、そこに関連があると思われます。しかし、それにもかかわらず、暗黙的な変換に関連する動的コンパイルの制限については認識していません。

動的コンパイル時に文字列コンストラクターと文字列の暗黙的な変換が失敗する理由を誰かがすぐに知らない限り、「ファイルまたはアセンブリを読み込めません」が役に立たないため、実際の動的コンパイラーエラーを表示する簡単な指示を誰かが教えてくれることを願っています。

本当にありがとう!

4

0 に答える 0