Re: NETLink - CREATING a new class?
- To: mathgroup at smc.vnet.net
- Subject: [mg45125] Re: [mg45085] NETLink - CREATING a new class?
- From: "ToolmakerSteve" <ToolmakerSteve at shawstudio.com>
- Date: Wed, 17 Dec 2003 07:54:40 -0500 (EST)
- References: <200312161121.GAA24769@smc.vnet.net> <4546.129.27.203.80.1071594228.bloek@pwebmail.utanet.at>
- Sender: owner-wri-mathgroup at wolfram.com
Here is my first attempt at "Hello, .NET World" - a Microsoft .NET executable created from Mathematica, using NET/CodeDOM. Based on a C# example that IS working on my PC. *** Doesn't work yet. *** There are two known problems: 1. I haven't succeeded in declaring Main() to be both "public and static" -- necessary to run it. Because: I haven't found a way to merge two MemberAttributes, and get the correct NET type back. 2. I haven't compiled it, because I get error: "NET::nomethod: No public instance method named CompileAssemblyFromDom exists for the .NET type Microsoft.CSharp.CSharpCodeGenerator." NOTE: my NEXT message will contain a "Notebook Expression" version - save as a ".m" file, and open in Mathematica, to get properly formatted input, as well as my output. ---------------------------------------------------- In[154]:= Needs["NETLink`"] InstallNET[] (* "net1 | net2" *) NetBitOr[ net1_, net2_ ] := BitOr[ NETObjectToExpression[ net1 ], NETObjectToExpression[ net2 ] ]; (* TBD : haven't found a way to do this yet. TBD *) NetMergeAttributes[ net1_, net2_ ] := net1 (* | net2 *); NETBlock[ Module[ {assemblyName, className, netSpace1, spaceTypes1, netType1, main, \ snippet1, statement1, compUnit1, compParams, refAssemblies, csharp, cscompiler, result}, assemblyName = "MyNamespace"; className = "HelloWorldMsgApp"; outputPath = "c:\\Temp\\HelloWorldMsg.exe"; (* Load type(s) to call static members.*) (LoadNETType[ "System.CodeDom.MemberAttributes" ]) // Print; (netSpace1 = NETNew[ "System.CodeDom.CodeNamespace" ]) // Print; netSpace1@Name = assemblyName; netSpace1@Name // Print; (spaceTypes1 = netSpace1@Types) // Print; spaceTypes1@Count // Print; netType1 = NETNew[ "System.CodeDom.CodeTypeDeclaration" ]; netType1@Name = className; netType1@IsClass = True; (MemberAttributes`Public) // Print; netType1@Attributes = MemberAttributes`Public; spaceTypes1@Add[ netType1 ]; spaceTypes1@Count // Print; spaceTypes1@Item[ 0 ] // Print; (spaceTypes1@Item[ 0 ])@Name // Print; (main = NETNew[ "System.CodeDom.CodeEntryPointMethod" ]) // Print; main@Name = "Main"; (NetBitOr[ MemberAttributes`Public, MemberAttributes`Static ]) // Print; main@Attributes = NetMergeAttributes[ MemberAttributes`Public, MemberAttributes`Static ]; (main@Attributes) // Print; (netType1@Members)@Add[ main ]; ((netType1@Members)@Count) // Print; snippet1 = NETNew[ "System.CodeDom.CodeSnippetExpression", "MessageBox.Show( \"Hello, .NET World!\" )" ]; statement1 = NETNew[ "System.CodeDom.CodeExpressionStatement", snippet1 ]; statement1 // Print; (statement1@Expression)@UserData // Print; (main@Statements)@Add[ statement1 ]; ((main@Statements)@Count) // Print; compUnit1 = NETNew[ "System.CodeDom.CodeCompileUnit" ]; (compUnit1@Namespaces)@Add[ netSpace1 ]; compParams = NETNew[ "System.CodeDom.Compiler.CompilerParameters" ]; refAssemblies = compParams@ReferencedAssemblies; refAssemblies@Add[ "mscorlib.dll" ]; refAssemblies@Add[ "System.dll" ]; refAssemblies@Add[ "System.Drawing.dll" ]; refAssemblies@Add[ "System.Windows.Forms.dll" ]; refAssemblies@Count // Print; compParams@GenerateInMemory = False; compParams@GenerateExecutable = True; compParams@MainClass = assemblyName <> "." <> className; (compParams@MainClass) // Print; (compParams@OutputAssembly = outputPath) // Print; (* Code snippets were given in c#, so use c# compiler. *) csharp = NETNew[ "Microsoft.CSharp.CSharpCodeProvider" ]; cscompiler = csharp@CreateCompiler[]; result = cscompiler@CompileAssemblyFromDom[ compParams, compUnit1 ]; result // Print; ] ]
- References:
- NETLink - CREATING a new class?
- From: ToolmakerSteve@shawstudio.com (ToolmakerSteve)
- NETLink - CREATING a new class?