CSharpUtilities.CSharpCompilationHelper

The Microsoft.CSharp.CSharpCodeProvider.CompileAssemblyFromSource method used by scripts to compile c# code is not supported by .net core. It allows users to create tools that access .NET functionality not available in MAXScript without requiring end-users to install additional DLLs.

Added class/method:

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>

This method compiles the code string as an assembly and loads the assembly. If compile error(s) occur, a .Net exception is thrown containing information on the error(s).

usage in script would look like:

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

All assemblies currently defined in max are automatically referenced when compiling, so normally additionalAssemblies would be an empty array. The assembly paths in additionalAssemblies need to be fully qualified assembly dll paths.

Available in 3ds Max 2026 and higher

Before:

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
)

After:

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
)    

Usage:

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