CSharpUtilities.CSharpCompilationHelper

スクリプトが C# コードをコンパイルするために使用される Microsoft.CSharp.CSharpCodeProvider.CompileAssemblyFromSource メソッドは、.NET Core ではサポートされていません。エンドユーザが追加の DLL をインストールしなくても、MAXScript では使用できない .NET 機能にアクセスするツールを作成することができます。

追加されたクラス/メソッド:

static Assembly CSharpUtilities.CSharpCompilationHelper.Compile(string code, string[] additionalAssemblies)
<param name="code">Source string.</param>
<param name="additionalAssemblies">An array of additional assemblies to reference .</param>
<returns>The loaded assembly.</returns>

このメソッドは、コード文字列をアセンブリとしてコンパイルし、アセンブリをロードします。コンパイル エラーが発生すると、エラー情報を含む .Net 例外がスローされます。

スクリプトでの使用法は、次のようになります。

CSharpCompilationHelper = dotnetclass "CSharpUtilities.CSharpCompilationHelper"
theAssy = CSharpCompilationHelper.compile source #()

max で現在定義されているすべてのアセンブリはコンパイル時に自動的に参照されるので、通常、additionalAssemblies は空の配列になります。additionalAssemblies 内のアセンブリ パスは、完全修飾アセンブリ dll パスである必要があります。

3ds Max 2026 以降で使用可能です。

変更前:

stdout = Undefined

try (
    -- MaxScript can't write to stdout (the actual console) 
    -- hack around it with CSharp. 
    code = "
    using System;

    class StdOutPrinter {
        static public bool print(string txt) {
            Console.WriteLine(txt);
            return true;
        }
    }
    "
    fn createAssembly code className = (
        provider = dotNetObject "Microsoft.CSharp.CSharpCodeProvider"
        param = dotNetObject "System.CodeDom.Compiler.CompilerParameters"
        param.GenerateInMemory = on
        compiled = provider.CompileAssemblyFromSource param #(code)
        compiled.CompiledAssembly.CreateInstance className
    )

    stdout = createAssembly code "StdOutPrinter"
)
catch(
    --- Do Nothing
)

処理後:

stdout = Undefined

try (
    -- MaxScript can't write to stdout (the actual console) 
    -- hack around it with CSharp.
    dotnet.loadassembly "System.Console.dll"
    code = "
    using System;

    class StdOutPrinter {
        static public bool print(string txt) {
            Console.WriteLine(txt);
            return true;
        }
    }
    "
    fn createAssembly code = (
        local CSharpCompilationHelper = dotnetclass "CSharpUtilities.CSharpCompilationHelper"
        CSharpCompilationHelper.compile code #()
        dotnetclass "StdOutPrinter" -- return value
    )
    stdout = createAssembly code 
)
catch(
    --- Do Nothing
)    

使用方法:

stdout.print "hello world\n"
-> true