6

これでどこに行けばいいのかよくわかりません。全体的な目的は、ユーザースクリプトを取得し、それを.NET環境内で実行できるようにすることです。私はほとんどのコードを記述していて、自分のアセンブリをロードしようとしない限り、物事は機能します。ただし、ユーザーがシステムの内部に安全にアクセスできるようにするために、プロキシDLLが作成されています。これが問題のようです。

現在、このプロキシDLLには、インターフェイスという1つのものが含まれています。

CompilerParameters options = new CompilerParameters();
options.GenerateExecutable = false;
options.GenerateInMemory = true;
options.ReferencedAssemblies.Add("System.dll");
options.ReferencedAssemblies.Add("ScriptProxy.dll");

Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
CompilerResults result = provider.CompileAssemblyFromSource(options, script);

// This line here throws the error:
return result.CompiledAssembly;

上記のコードを実行すると、次のエラーがスローされます。

System.IO.FileNotFoundException:ファイルまたはアセンブリ'file:/// C:\ Users ... \ AppData \ Local \ Temp\scts5w5o.dll'またはその依存関係の1つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

もちろん、私の最初の考えは、「...そしてscts5w5o.dllとは何ですか?」です。

これはScriptProxy.dll正しくロードされていませんか、それともScriptProxy.dll自体が一時ファイルのどこかにある依存関係をロードしようとしていますか?それとも完全に違うものですか?

言及する必要があります、私はNUnitテストランナーからこのコードを実行しています。それが違いを生むかどうかはわかりません。

4

2 に答える 2

8

これは、コンパイルステップが失敗し、エラーがないかチェックしていないためです...

    static Assembly Compile(string script)
    {
        CompilerParameters options = new CompilerParameters();
        options.GenerateExecutable = false;
        options.GenerateInMemory = true;
        options.ReferencedAssemblies.Add("System.dll");
        options.ReferencedAssemblies.Add("ScriptProxy.dll");

        Microsoft.CSharp.CSharpCodeProvider provider = new Microsoft.CSharp.CSharpCodeProvider();
        CompilerResults result = provider.CompileAssemblyFromSource(options, script);

        // Check the compiler results for errors
        StringWriter sw = new StringWriter();
        foreach (CompilerError ce in result.Errors)
        {
            if (ce.IsWarning) continue;
            sw.WriteLine("{0}({1},{2}: error {3}: {4}", ce.FileName, ce.Line, ce.Column, ce.ErrorNumber, ce.ErrorText);
        }
        // If there were errors, raise an exception...
        string errorText = sw.ToString();
        if (errorText.Length > 0)
            throw new ApplicationException(errorText);

        return result.CompiledAssembly;
    }
于 2012-05-01T19:24:33.530 に答える
4

answerとしてマークされた投稿は本当に答えではないと思います!!! ...しかし私はここで答えを見つけました

parameters.ReferencedAssemblies.Add(typeof(<TYPE FROM DOMAIN.DLL>).Assembly.Location);

つまり、サードパーティの参照を追加しようとしている場合dll(.net dllも例外を与える場合があります)、それをコピーするだけexecutable folderです。それは正常に機能します。それ以外の場合は、そこにフルパスを定義することもできます。

于 2015-10-29T08:42:27.897 に答える