<?xml version="1.0"?><?xml-stylesheet type="text/xsl" href="/rss.xsl"?><rss version="2.0"><channel><title>crossnet Wiki &amp; Documentation Rss Feed</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Home</link><description>crossnet Wiki Rss Description</description><item><title>New Comment on "started"</title><link>http://crossnet.codeplex.com/wikipage?title=started&amp;ANCHOR#C17625</link><description>Reflector crashes each time I run it with &amp;#47;crossnet &amp;#58;-&amp;#40;</description><author>mjaggard</author><pubDate>Thu, 11 Nov 2010 15:55:03 GMT</pubDate><guid isPermaLink="false">New Comment on "started" 20101111035503P</guid></item><item><title>Updated Wiki: started</title><link>http://crossnet.codeplex.com/wikipage?title=started&amp;version=5</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;How to get started?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Here are all the steps to get started. Depending of your knowledge of Microsoft Visual Studio, it can take 15 minutes to 1 hour.&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Create a temporary folder (named C:\TempFolder here) where you will setup everything.
&lt;ol&gt;&lt;li&gt;Download latest version of Reflector and unzip it - &lt;a href="http://www.red-gate.com/products/reflector/" class="externalLink"&gt;http://www.red-gate.com/products/reflector/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download CrossNet sources - &lt;a href="http://crossnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7414" class="externalLink"&gt;http://crossnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7414&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download CrossNetSystem sources - &lt;a href="http://crossnetsystem.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7856" class="externalLink"&gt;http://crossnetsystem.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7856&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Unzip all and remove read only attributes for all the files (except if you are using a revision control system).&lt;/li&gt;
&lt;li&gt;Open Microsoft Visual Studio 2005. If you are using 2008, it will upgrade the projects automatically for you.
&lt;ol&gt;&lt;li&gt;Create an empty solution.&lt;/li&gt;
&lt;li&gt;Move the parent folder of each projects in the same folder as the solution file. (i.e. we skip the package name and version). Although you can have put the projects where you want, it will reduce the setup later.&lt;/li&gt;
&lt;li&gt;You should end up with something like that:
&lt;ol&gt;&lt;li&gt;C:\TempFolder\CrossNet.sln&lt;/li&gt;
&lt;li&gt;And for each project (like for CrossNetRuntime):&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\CrossNetRuntime.vcproj&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\includes\...&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\sources\...&lt;/li&gt;
&lt;li&gt;So each project file should be one level below the solution file.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Add every projects to the solution. You should have 7 projects in the solution:
&lt;ol&gt;&lt;li&gt;CplusplusBenchmark&lt;/li&gt;
&lt;li&gt;CrossNetBenchmark&lt;/li&gt;
&lt;li&gt;CrossNetParser&lt;/li&gt;
&lt;li&gt;CrossNetRuntime&lt;/li&gt;
&lt;li&gt;CrossNetSystem&lt;/li&gt;
&lt;li&gt;CSharpBenchmark&lt;/li&gt;
&lt;li&gt;Reflector.CrossNet&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Duplicate the file Reflector.exe and rename it to Reflector.dll. &lt;b&gt;You will need to do that everytime you update the version of Reflector.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Open the projects &amp;quot;CrossNetParser&amp;quot; and &amp;quot;Reflector.CrossNet&amp;quot; and update the references to the Reflector.dll that you just created.&lt;/li&gt;
&lt;li&gt;Now we need to fix up the runtime references and the BCL references to CrossNetBenchmark, we are going to use CrossNetSystem for that. Open CrossNetBenchmark properties, go into the Configuration properties -&amp;gt; Linker -&amp;gt; Inputs
&lt;ol&gt;&lt;li&gt;In additional dependencies, type: ..\$(ConfigurationName)\CrossNetRuntime.lib ..\$(ConfigurationName)\CrossNetSystem.lib&lt;/li&gt;
&lt;li&gt;Build CrossNetBenchmark and there should be no compile / link error.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Now compile CrossNetParser and you should have 4 compile errors. This is expected. Since October 2007, Reflector API changed for the using keyword. For the moment, replace .Variable by .Expression. I&amp;#39;ll send you a real fix if you are using &amp;quot;using&amp;quot; :) Sorry about that.&lt;/li&gt;
&lt;li&gt;At that point you should be able to compile the whole solution without any error.&lt;/li&gt;
&lt;li&gt;Copy Reflector.CrossNet.dll and CrossNet.dll where you have Reflector.exe. If you built the whole solution, the two dlls should be in the bin folder of Reflector.CrossNet.&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now that everything is configured correctly we can start to have fun.&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Compile CSharpBenchmark. If you want to run it and see what the benchmark does:
&lt;ol&gt;&lt;li&gt;Rename the method Test() in the class CSharpBenchmark._Benchmark.Benchmark to Main()&lt;/li&gt;
&lt;li&gt;Make the library a console application.&lt;/li&gt;
&lt;li&gt;Run the C# Benchmark.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Revert these changes for the C++ conversion.&lt;/li&gt;
&lt;li&gt;Once compiled, go in the folder Reflector.CrossNet and modify example.xml like this:
&lt;ol&gt;&lt;li&gt;Change &amp;lt;OutputFolder&amp;gt;YourOutputPath&amp;lt;/OutputFolder&amp;gt; to &amp;lt;OutputFolder&amp;gt;C:\TempFolder\CrossNetBenchmark\&amp;lt;/OutputFolder&amp;gt;&lt;/li&gt;
&lt;li&gt;Change &amp;lt;AssemblyToParse&amp;gt;FirstPath\FirstAssembly.dll&amp;lt;/AssemblyToParse&amp;gt; to &amp;lt;AssemblyToParse&amp;gt;C:\TempFolder\CSharpBenchmark\bin\Debug\CSharpBenchmark.dll&amp;lt;/AssemblyToParse&amp;gt;&lt;/li&gt;
&lt;li&gt;Remove &amp;lt;AssemblyToParse&amp;gt;SecondPath\SecondAssembly.dll&amp;lt;/AssemblyToParse&amp;gt;&lt;/li&gt;
&lt;li&gt;Make sure that the paths are correct.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;You will need to change the xml file only when adding new assemblies (to parse or to reference)&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Run Reflector.exe, select .NET 2.0 runtime version (it should not matter but never know).
&lt;ol&gt;&lt;li&gt;Go in View -&amp;gt; AddIns, and add Reflector.CrossNet to the list of add-ins.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;If you regularly use Reflector make sure that the optimization mode is set to .NET 2.0 (not 3.0+).&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Close Reflector.exe.&lt;/li&gt;
&lt;li&gt;Open the command prompt (run cmd.exe) and go in the folder where Reflector.exe is located (and the 2 other dlls).&lt;/li&gt;
&lt;li&gt;Type: Reflector.exe /crossnet:C:\TempFolder\Reflector.CrossNet\Example.xml&lt;/li&gt;
&lt;li&gt;This will show Reflector UI for few seconds and should close it after a short beep.&lt;/li&gt;
&lt;li&gt;If you go in CrossNetBenchmark folder you should see the C++ sources updated.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Go back to Visual Studio, compile again CrossNetBenchmark, it should compile and link correctly (there may be some link warnings about missing pdbs).
&lt;ol&gt;&lt;li&gt;You can now run the benchmark (C# code translated in C++).&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;List of things that you should consider at some point:
&lt;ol&gt;&lt;li&gt;Make step 4 a post-build step to the step 1. (using a batch file).&lt;/li&gt;
&lt;li&gt;Switch the C++ code to release to have real performance.&lt;/li&gt;
&lt;li&gt;Tweak the compile flags to optimize more. Set the dependencies correctly in the solution.&lt;/li&gt;
&lt;li&gt;Modify the C# benchmark code or reference your own assembly instead.&lt;/li&gt;
&lt;li&gt;Remember to augment CrossNetSystem if you are using more CLR classes (and share with the community).&lt;/li&gt;
&lt;li&gt;etc...&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;b&gt;Enjoy and have fun!&lt;/b&gt;&lt;/div&gt;&lt;div class="ClearBoth"&gt;&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Wed, 12 May 2010 01:38:44 GMT</pubDate><guid isPermaLink="false">Updated Wiki: started 20100512013844A</guid></item><item><title>Updated Wiki: started</title><link>http://crossnet.codeplex.com/Wiki/View.aspx?title=started&amp;version=4</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;How to get started?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Here are all the steps to get started. Depending of your knowledge of Microsoft Visual Studio, it can take 15 minutes to 1 hour.&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Create a temporary folder (named C:\TempFolder here) where you will setup everything.
&lt;ol&gt;&lt;li&gt;Download latest version of Reflector and unzip it - &lt;a href="http://www.red-gate.com/products/reflector/" class="externalLink"&gt;http://www.red-gate.com/products/reflector/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download CrossNet sources - &lt;a href="http://crossnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7414" class="externalLink"&gt;http://crossnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7414&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download CrossNetSystem sources - &lt;a href="http://crossnetsystem.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7856" class="externalLink"&gt;http://crossnetsystem.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7856&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Unzip all and remove read only attributes for all the files (except if you are using a revision control system).&lt;/li&gt;
&lt;li&gt;Open Microsoft Visual Studio 2005. If you are using 2008, it will upgrade the projects automatically for you.
&lt;ol&gt;&lt;li&gt;Create an empty solution.&lt;/li&gt;
&lt;li&gt;Move the parent folder of each projects in the same folder as the solution file. (i.e. we skip the package name and version). Although you can have put the projects where you want, it will reduce the setup later.&lt;/li&gt;
&lt;li&gt;You should end up with something like that:
&lt;ol&gt;&lt;li&gt;C:\TempFolder\CrossNet.sln&lt;/li&gt;
&lt;li&gt;And for each project (like for CrossNetRuntime):&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\CrossNetRuntime.vcproj&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\includes\...&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\sources\...&lt;/li&gt;
&lt;li&gt;So each project file should be one level below the solution file.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Add every projects to the solution. You should have 7 projects in the solution:
&lt;ol&gt;&lt;li&gt;CplusplusBenchmark&lt;/li&gt;
&lt;li&gt;CrossNetBenchmark&lt;/li&gt;
&lt;li&gt;CrossNetParser&lt;/li&gt;
&lt;li&gt;CrossNetRuntime&lt;/li&gt;
&lt;li&gt;CrossNetSystem&lt;/li&gt;
&lt;li&gt;CSharpBenchmark&lt;/li&gt;
&lt;li&gt;Reflector.CrossNet&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Duplicate the file Reflector.exe and rename it to Reflector.dll. &lt;b&gt;You will need to do that everytime you update the version of Reflector.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Open the projects &amp;quot;CrossNetParser&amp;quot; and &amp;quot;Reflector.CrossNet&amp;quot; and update the references to the Reflector.dll that you just created.&lt;/li&gt;
&lt;li&gt;Now we need to fix up the runtime references and the BCL references to CrossNetBenchmark, we are going to use CrossNetSystem for that. Open CrossNetBenchmark properties, go into the Configuration properties -&amp;gt; Linker -&amp;gt; Inputs
&lt;ol&gt;&lt;li&gt;In additional dependencies, type: ..\$(ConfigurationName)\CrossNetRuntime.lib ..\$(ConfigurationName)\CrossNetSystem.lib&lt;/li&gt;
&lt;li&gt;Build CrossNetBenchmark and there should be no compile / link error.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Now compile CrossNetParser and you should have 4 compile errors. This is expected. Since October 2007, Reflector API changed for the using keyword. For the moment, replace .Variable by .Expression. I'll send you a real fix if you are using &amp;quot;using&amp;quot; :) Sorry about that.&lt;/li&gt;
&lt;li&gt;At that point you should be able to compile the whole solution without any error.&lt;/li&gt;
&lt;li&gt;Copy Reflector.CrossNet.dll and CrossNet.dll where you have Reflector.exe. If you built the whole solution, the two dlls should be in the bin folder of Reflector.CrossNet.&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now that everything is configured correctly we can start to have fun.&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Compile CSharpBenchmark. If you want to run it and see what the benchmark does:
&lt;ol&gt;&lt;li&gt;Rename the method Test() in the class CSharpBenchmark._Benchmark.Benchmark to Main()&lt;/li&gt;
&lt;li&gt;Make the library a console application.&lt;/li&gt;
&lt;li&gt;Run the C# Benchmark.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Revert these changes for the C++ conversion.&lt;/li&gt;
&lt;li&gt;Once compiled, go in the folder Reflector.CrossNet and modify example.xml like this:
&lt;ol&gt;&lt;li&gt;Change &amp;lt;OutputFolder&amp;gt;YourOutputPath&amp;lt;/OutputFolder&amp;gt; to &amp;lt;OutputFolder&amp;gt;C:\TempFolder\CrossNetBenchmark\&amp;lt;/OutputFolder&amp;gt;&lt;/li&gt;
&lt;li&gt;Change &amp;lt;AssemblyToParse&amp;gt;FirstPath\FirstAssembly.dll&amp;lt;/AssemblyToParse&amp;gt; to &amp;lt;AssemblyToParse&amp;gt;C:\TempFolder\CSharpBenchmark\bin\Debug\CSharpBenchmark.dll&amp;lt;/AssemblyToParse&amp;gt;&lt;/li&gt;
&lt;li&gt;Remove &amp;lt;AssemblyToParse&amp;gt;SecondPath\SecondAssembly.dll&amp;lt;/AssemblyToParse&amp;gt;&lt;/li&gt;
&lt;li&gt;Make sure that the paths are correct.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;You will need to change the xml file only when adding new assemblies (to parse or to reference)&lt;/b&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Run Reflector.exe, select .NET 2.0 runtime version (it should not matter but never know).
&lt;ol&gt;&lt;li&gt;Go in View -&amp;gt; AddIns, and add Reflector.CrossNet to the list of add-ins.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;If you regularly use Reflector make sure that the optimization mode is set to .NET 2.0 (not 3.0&lt;/u&gt;).&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Close Reflector.exe.&lt;/li&gt;
&lt;li&gt;Open the command prompt (run cmd.exe) and go in the folder where Reflector.exe is located (and the 2 other dlls).&lt;/li&gt;
&lt;li&gt;Type: Reflector.exe /select:Reflector.CrossNet /crossnet:C:\TempFolder\Reflector.CrossNet\Example.xml&lt;/li&gt;
&lt;li&gt;This will show Reflector UI for few seconds and should close it after a short beep.&lt;/li&gt;
&lt;li&gt;If you go in CrossNetBenchmark folder you should see the C++ sources updated.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Go back to Visual Studio, compile again CrossNetBenchmark, it should compile and link correctly (there may be some link warnings about missing pdbs).
&lt;ol&gt;&lt;li&gt;You can now run the benchmark (C# code translated in C++).&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;List of things that you should consider at some point:
&lt;ol&gt;&lt;li&gt;Make step 4 a post-build step to the step 1. (using a batch file).&lt;/li&gt;
&lt;li&gt;Switch the C++ code to release to have real performance.&lt;/li&gt;
&lt;li&gt;Tweak the compile flags to optimize more. Set the dependencies correctly in the solution.&lt;/li&gt;
&lt;li&gt;Modify the C# benchmark code or reference your own assembly instead.&lt;/li&gt;
&lt;li&gt;Remember to augment CrossNetSystem if you are using more CLR classes (and share with the community).&lt;/li&gt;
&lt;li&gt;etc...&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;b&gt;Enjoy and have fun!&lt;/b&gt;&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Tue, 21 Apr 2009 04:25:02 GMT</pubDate><guid isPermaLink="false">Updated Wiki: started 20090421042502A</guid></item><item><title>Updated Wiki: started</title><link>http://crossnet.codeplex.com/Wiki/View.aspx?title=started&amp;version=3</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;How to get started?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Here are all the steps to get started. Depending of your knowledge of Microsoft Visual Studio, it can take 15 minutes to 1 hour.&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Create a temporary folder (named C:\TempFolder here) where you will setup everything.
&lt;ol&gt;&lt;li&gt;Download latest version of Reflector and unzip it - &lt;a href="http://www.red-gate.com/products/reflector/" class="externalLink"&gt;http://www.red-gate.com/products/reflector/&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download CrossNet sources - &lt;a href="http://crossnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7414" class="externalLink"&gt;http://crossnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7414&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Download CrossNetSystem sources - &lt;a href="http://crossnetsystem.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7856" class="externalLink"&gt;http://crossnetsystem.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=7856&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Unzip all and remove read only attributes for all the files (except if you are using a revision control system).&lt;/li&gt;
&lt;li&gt;Open Microsoft Visual Studio 2005. If you are using 2008, it will upgrade the projects automatically for you.
&lt;ol&gt;&lt;li&gt;Create an empty solution.&lt;/li&gt;
&lt;li&gt;Move the parent folder of each projects in the same folder as the solution file. (i.e. we skip the package name and version). Although you can have put the projects where you want, it will reduce the setup later.&lt;/li&gt;
&lt;li&gt;You should end up with something like that:
&lt;ol&gt;&lt;li&gt;C:\TempFolder\CrossNet.sln&lt;/li&gt;
&lt;li&gt;And for each project (like for CrossNetRuntime):&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\CrossNetRuntime.vcproj&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\includes\...&lt;/li&gt;
&lt;li&gt;C:\TempFolder\CrossNetRuntime\sources\...&lt;/li&gt;
&lt;li&gt;So each project file should be one level below the solution file.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Add every projects to the solution. You should have 7 projects in the solution:
&lt;ol&gt;&lt;li&gt;CplusplusBenchmark&lt;/li&gt;
&lt;li&gt;CrossNetBenchmark&lt;/li&gt;
&lt;li&gt;CrossNetParser&lt;/li&gt;
&lt;li&gt;CrossNetRuntime&lt;/li&gt;
&lt;li&gt;CrossNetSystem&lt;/li&gt;
&lt;li&gt;CSharpBenchmark&lt;/li&gt;
&lt;li&gt;Reflector.CrossNet&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Duplicate the file Reflector.exe and rename it to Reflector.dll. &lt;b&gt;You will need to do that everytime you update the version of Reflector.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Open the projects &amp;quot;CrossNetParser&amp;quot; and &amp;quot;Reflector.CrossNet&amp;quot; and update the references to the Reflector.dll that you just created.&lt;/li&gt;
&lt;li&gt;Now we need to fix up the runtime references and the BCL references to CrossNetBenchmark, we are going to use CrossNetSystem for that. Open CrossNetBenchmark properties, go into the Configuration properties -&amp;gt; Linker -&amp;gt; Inputs
&lt;ol&gt;&lt;li&gt;In additional dependencies, type: ..\$(ConfigurationName)\CrossNetRuntime.lib ..\$(ConfigurationName)\CrossNetSystem.lib&lt;/li&gt;
&lt;li&gt;Build CrossNetBenchmark and there should be no compile / link error.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Now compile CrossNetParser and you should have 4 compile errors. This is expected. Since October 2007, Reflector API changed for the using keyword. For the moment, replace .Variable by .Expression. I'll send you a real fix if you are using &amp;quot;using&amp;quot; :) Sorry about that.&lt;/li&gt;
&lt;li&gt;At that point you should be able to compile the whole issue without any error.&lt;/li&gt;
&lt;li&gt;Copy Reflector.CrossNet.dll and CrossNet.dll where you have Reflector.exe. If you built the whole solution, the two dlls should be in the bin folder of Reflector.CrossNet.&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Now that everything is configured correctly we can start to have fun.&lt;/b&gt;&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;Compile CSharpBenchmark. If you want to run it and see what the benchmark does:
&lt;ol&gt;&lt;li&gt;Rename the method Test() in the class CSharpBenchmark._Benchmark.Benchmark.Test to Main()&lt;/li&gt;
&lt;li&gt;Make the library a console application.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Revert these changes for the C++ conversion.&lt;/li&gt;
&lt;li&gt;Once compiled, go in the folder Reflector.CrossNet and modify example.xml like this:
&lt;ol&gt;&lt;li&gt;Change &amp;lt;OutputFolder&amp;gt;YouOutputPath&amp;lt;/OutputFolder&amp;gt; to &amp;lt;OutputFolder&amp;gt;C:\TempFolder\CrossNetBenchmark\&amp;lt;/OutputFolder&amp;gt;&lt;/li&gt;
&lt;li&gt;Change &amp;lt;AssemblyToParse&amp;gt;FirstPath\FirstAssembly.dll&amp;lt;/AssemblyToParse&amp;gt; to &amp;lt;AssemblyToParse&amp;gt;C:\TempFolder\CSharpBenchmark\bin\Debug\CSharpBenchmark.dll&amp;lt;/AssemblyToParse&amp;gt;&lt;/li&gt;
&lt;li&gt;Remove &amp;lt;AssemblyToParse&amp;gt;SecondPath\SecondAssembly.dll&amp;lt;/AssemblyToParse&amp;gt;&lt;/li&gt;
&lt;li&gt;Make sure that the paths are correct.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Run Reflector.exe, select .NET 2.0 runtime version (it should not matter but never know).
&lt;ol&gt;&lt;li&gt;Go in View -&amp;gt; AddIns, and add Reflector.CrossNet to the list of add-ins.&lt;/li&gt;
&lt;li&gt;If you regularly use Reflector make sure that the optimization is set to .NET 2.0 (not 3.0&lt;/u&gt;).&lt;/li&gt;
&lt;li&gt;Close Reflector.exe.&lt;/li&gt;
&lt;li&gt;Open the command prompt (run cmd.exe) and go in the folder where Reflector.exe is located (and the 2 other dlls).&lt;/li&gt;
&lt;li&gt;Type: Reflector.exe /select:Reflector.CrossNet /crossnet:C:\TempFolder\Reflector.CrossNet\Example.xml&lt;/li&gt;
&lt;li&gt;This will show Reflector UI for few seconds and should close it after a short beep.&lt;/li&gt;
&lt;li&gt;If you go in CrossNetBenchmark folder you should see the C++ sources updated.&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Go back to Visual Studio, compile again CrossNetBecnhmark, it should compile and link correctly (there may be some warnings).
&lt;ol&gt;&lt;li&gt;You can now run the benchmark (C# code translated in C++)&lt;/li&gt;&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;Add step 3 as post-build step to the step 1. Switch the C++ code to release to have real performance. Modify the C# benchmark code or reference your own assembly instead. Remember to augment CrossNetSystem if you are using more CLR classes (and share with the community).&lt;/li&gt;&lt;/ol&gt;
&lt;br /&gt;&lt;b&gt;Enjoy and have fun!&lt;/b&gt;&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Tue, 21 Apr 2009 04:09:01 GMT</pubDate><guid isPermaLink="false">Updated Wiki: started 20090421040901A</guid></item><item><title>Updated Wiki: Overview</title><link>http://crossnet.codeplex.com/Wiki/View.aspx?title=Overview&amp;version=14</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Overview:&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;CrossNet is composed of several layers:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CrossNetParser:&lt;/b&gt;&lt;br /&gt;This API reads a .NET assembly and generates unmanaged C++ files.&lt;br /&gt;CrossNetParser is based on top of Reflector, an Add-In is provided.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;CrossNetRuntime:&lt;/b&gt;&lt;br /&gt;This C++ library is the core of CrossNet. You must compile and link this library against your generated C++ files.&lt;br /&gt;CrossNetRuntime has a list of &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=predefined%20.NET%20types&amp;referringTitle=Home"&gt;predefined .NET types&lt;/a&gt; already. The user cannot override them directly (except by changing CrossNetRuntime sources).&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Additional things that you will need:&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;You will have to provide your own implementation of &lt;b&gt;BCL&lt;/b&gt; (Base Class Library - like collections, Console, Diagnostics, etc...).&lt;br /&gt;Your assembly will certainly need this BCL assembly to be able to compile and link. You can provide the BCL in several manners:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;&lt;b&gt;Use CrossNetSystem implementation&lt;/b&gt;. &lt;a href="http://www.codeplex.com/crossnetsystem" class="externalLink"&gt;CrossNetSystem&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; is another open source project. As of September 2007, this is not yet recommended as the very few classes are supported, and the implementation is certainly not correct. But it is expected to improve over time.&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;b&gt;Use Mono's implementation&lt;/b&gt;. You can use CrossNetParser to transform Mono's BCL in C++, and integrate it in your process. I believe the Mono's license let you do that, you will have to check though.&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;&lt;b&gt;Write your own.&lt;/b&gt; This is a huge task, you really don't want to do that (but that's your choice). It would be better if you were contributing to CrossNetSystem.&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;Note that if you are implementing BCL (or any other class) in C++, you take the risk for your code to be broken if CrossNet's API change.&lt;br /&gt;You won't have this issue if you are using C#.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Please do not disassemble Microsoft's BCL implementation (with CrossNet or anything else). I don't think you have the rights. Please don't do it.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;In any case, there will be some technical issues - First CrossNetParser would generate incorrect C++ code in the most complex cases&lt;/b&gt;&lt;br /&gt;&lt;b&gt;of the Microsoft assemblies, and also one would have to implement many external methods. A lot of time will be spent modifying by hand the generated C++ code.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Instead, please contribute to CrossNetSystem.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Before you can execute any code in your assembly, you will also have to initialize CrossNetRuntime.&lt;br /&gt;This initialization is mostly setting up the memory buffers and few callbacks, as well as implement the class System.Type.&lt;br /&gt;&lt;br /&gt;You can find here more details:&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;How do I get &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=started&amp;referringTitle=Home"&gt;started&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=generating%20CPlusCplus&amp;referringTitle=Home"&gt;Why generate C&amp;#43;&amp;#43;&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Can you describe the &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=workflow&amp;referringTitle=Home"&gt;workflow&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;How do I use &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=several%20assemblies&amp;referringTitle=Home"&gt;several assemblies&lt;/a&gt; together?&lt;/li&gt;
&lt;li&gt;How does the &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=Garbage%20Collector&amp;referringTitle=Home"&gt;Garbage Collector&lt;/a&gt; work?&lt;/li&gt;
&lt;li&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=What%20about%20.NET%203.0%20and%20later&amp;referringTitle=Home"&gt;What about .NET 3.0 and later&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Do you have some &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=benchmarks&amp;referringTitle=Home"&gt;benchmarks&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;What is the &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=memory%20usage&amp;referringTitle=Home"&gt;memory usage&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;How can I &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=contribute&amp;referringTitle=Home"&gt;contribute&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Do you have some &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=unit-tests&amp;referringTitle=Home"&gt;unit-tests&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;How can I create my own &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=user%27s%20policy&amp;referringTitle=Home"&gt;user&amp;#39;s policy&lt;/a&gt; in the parser?&lt;/li&gt;
&lt;li&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=Examples%20of%20generated%20code&amp;referringTitle=Home"&gt;Examples of generated code&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;If you have more questions (I'm sure you do), you can look at the code, examples, and unit-tests.&lt;br /&gt;Don't hesitate to use the forums as well.&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Thu, 16 Apr 2009 04:25:19 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Overview 20090416042519A</guid></item><item><title>Updated Wiki: Important notes!</title><link>http://crossnet.codeplex.com/Wiki/View.aspx?title=Important notes!&amp;version=4</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;Important notes!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The project has been public since September 2007, and as such, you must expect some issues. ;)&lt;br /&gt;Please use the forum if you have any question or feedback!&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;The tests are done on PC with VS2005. Do expect some issues on X360 / PS3 / Wii or even any other C++ compiler. I unfortunately currently don't have the time to test any other compiler. I also don't have access to console devkits at home, so bear with me. Please report to the issue tracker any compile error that you have as I'm sure they'll be easy to fix.&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;Although I spent quite some time on CrossNet, there are still many many cases where the C++ code is incorrectly generated, or places where the runtime is buggy (or even not implemented at all). Even if a lot of cases are covered already, I want to set your expectations low for the moment so you don't have bad surprises. ;)&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;CrossNet is using Reflector. Even if this tool is of very high quality, there are still some known bugs that should be fixed soon. If your assembly can't be parsed correctly, try to compile it with optimization and check overflow turned off, sometime that helps.&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;Some pieces are simply not finished  (look at the &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=To%20do%21&amp;referringTitle=Home"&gt;To do&amp;#33;&lt;/a&gt; list). If you really need that particular piece ASAP (either correct parsing or correct runtime behavior), again report it on the issue tracker.&lt;/li&gt;&lt;/ul&gt;

&lt;ul&gt;&lt;li&gt;In some rare optimization cases, the C++ compiler might be too smart (or too dumb depending on how you see it ;). It might save an offseted address on the stack for some objects in order to access members more quickly later. Unfortunately this can actually make the GC miss the object when crawling the stack. I added some code to actually detect and solve this case (or at least the only I have seen so far on VS2005). If when you run your code in release only, you see that one of your local object has been collected after a GC, try to reduce your optimization settings and see if that fixes the issue. If you can, send a simple example reproducing the issue so we can see how we can generalize the solution.&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;b&gt;Here is what you should do if you encounter some issues:&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;&lt;li&gt;Try to create the simplest test case and add it to the issue tracker. It is very important! Often it takes more time to reproduce those issues than actually fixing them.&lt;/li&gt;
&lt;li&gt;If the generated C++ code doesn't compile with your compiler, provide an example of how the code should be generated for your compiler to accept it. This way, I will be able to fix the issue even if I don't have access to your compiler.&lt;/li&gt;
&lt;li&gt;Change / Simplify your code a bit to use more intermediate variables / statements.&lt;/li&gt;
&lt;li&gt;Change your compile options (like turn optimization / check overflow off). Remember that the code is optimized by the C&lt;/u&gt;+ compiler at the end, so turning optimization off in the .NET side won't actually change the performance of the generated code.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Thu, 16 Apr 2009 04:23:24 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Important notes! 20090416042324A</guid></item><item><title>Updated Wiki: Home</title><link>http://crossnet.codeplex.com/Wiki/View.aspx?title=Home&amp;version=27</link><description>&lt;div class="wikidoc"&gt;&lt;b&gt;CrossNet is a cross platform .NET runtime.&lt;/b&gt;&lt;br /&gt;It parses .NET assemblies and generates unmanaged C++ code that can be compiled on any standard C++ compiler.&lt;br /&gt;&lt;br /&gt;More than 95% of the .NET 2.0 features are actually &amp;quot;emulated&amp;quot; in C++. CrossNet does &lt;b&gt;not&lt;/b&gt; produce managed C++, the generated code is pure ANSI C++.&lt;br /&gt;Even if that's only an emulation of .NET, the performance and memory usage are usually in the same range as C++ / .NET.&lt;br /&gt;It is important to note that CrossNet's parser is a Reflector Add-In.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=Examples%20of%20generated%20code"&gt;Examples of generated code&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;CrossNet is not the same thing as Mono:&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;CrossNet emulates the .NET runtime but the goal is not to write the full .NET API. Some very rarely used features might not be emulated correctly.&lt;br /&gt;Some tiny portions of the BCL (Base Class Library) have been implemented in C++, but the purpose was mostly for the development of unit-tests.&lt;br /&gt;When using CrossNet, one must &lt;b&gt;provide some BCL implementation&lt;/b&gt; (or at least for the classes / methods used).&lt;br /&gt;One can either augment the CrossNet emulation of BCL by using &lt;a href="http://www.codeplex.com/crossnetsystem" class="externalLink"&gt;CrossNetSystem&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; (not recommended yet), use Mono's or write own  implementation.&lt;br /&gt;&lt;br /&gt;CrossNet can be used where .NET / Mono might not be the best fit:
&lt;ul&gt;&lt;li&gt;The platform is not standard and doesn't support .NET or Mono.&lt;/li&gt;
&lt;li&gt;JIT cannot be implemented on the platform.&lt;/li&gt;
&lt;li&gt;The platform has some memory constraints.&lt;/li&gt;
&lt;li&gt;Best performance is needed and interpretation is not an option (i.e. Mint or MicroFramework might be too slow).&lt;/li&gt;
&lt;li&gt;A simple code that can be customized and facilitate user's policy is a plus (memory tracking for example...).&lt;/li&gt;
&lt;li&gt;There is a need for direct interaction with C++ code / compiler.&lt;/li&gt;
&lt;li&gt;The code needs to be easily understandable and maintainable (or could be used to learn how .NET behavior can be emulated).&lt;/li&gt;&lt;/ul&gt;
&lt;br /&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=Important%20notes%21"&gt;Important notes&amp;#33;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Please look at the &lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=overview"&gt;overview&lt;/a&gt;, there is a lot more information and links there!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=Features%20supported"&gt;Features supported&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=Features%20to%20be%20supported%20soon"&gt;Features to be supported soon&lt;/a&gt;&lt;br /&gt;&lt;a href="http://crossnet.codeplex.com/Wiki/View.aspx?title=Features%20not%20expected%20to%20be%20supported%20soon"&gt;Features not expected to be supported soon&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Thu, 16 Apr 2009 04:14:55 GMT</pubDate><guid isPermaLink="false">Updated Wiki: Home 20090416041455A</guid></item><item><title>UPDATED WIKI: Features to be supported soon</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features to be supported soon&amp;version=6</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Features to be supported (soon):&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Asynchronous delegates&lt;/li&gt;&lt;li&gt;Some uncommon fixed syntax&lt;/li&gt;&lt;li&gt;GC defragmentation / generational&lt;/li&gt;&lt;li&gt;__arglist, __makeref, __reftype, __refvalue&lt;/li&gt;&lt;li&gt;ToString() on enum values / type&lt;/li&gt;&lt;li&gt;Weak references&lt;/li&gt;&lt;li&gt;Full exceptions&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Will be supported with next change set (around end of September).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Exceptions with implementation not using C++ exceptions.&lt;/li&gt;&lt;li&gt;Exceptions for null dereference, divide by zero, etc...&lt;/li&gt;&lt;li&gt;StructLayout&lt;/li&gt;&lt;li&gt;Operations with System.Enum&lt;/li&gt;&lt;li&gt;Numerous bug fixes (and more complex unit tests to pass)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Sun, 14 Oct 2007 06:29:58 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Features to be supported soon 20071014062958A</guid></item><item><title>UPDATED WIKI: Features supported</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features supported&amp;version=11</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Features supported (with .NET 2.0 as base):&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Delegates&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Interfaces&amp;amp;referringTitle=Features%20supported"&gt;Interfaces&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Generics&amp;amp;referringTitle=Features%20supported"&gt;Generics&lt;/a&gt; (Few restrictions)&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Static constructors / members for generic types.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;.NET &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Arrays&amp;amp;referringTitle=Features%20supported"&gt;Arrays&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Properties / indexers&lt;/li&gt;&lt;li&gt;.NET Strings / String pooling / Switch on strings&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Boxing&amp;amp;referringTitle=Features%20supported"&gt;Boxing&lt;/a&gt; / Unboxing&lt;/li&gt;&lt;li&gt;Variable size &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=enums&amp;amp;referringTitle=Features%20supported"&gt;enums&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Foreach and enumerators&lt;/li&gt;&lt;li&gt;is / as / cast / GetType() / typeof&lt;/li&gt;&lt;li&gt;Events&lt;/li&gt;&lt;li&gt;.NET Operators&lt;/li&gt;&lt;li&gt;Method calls on primitive types&lt;/li&gt;&lt;li&gt;Virtual calls in &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=constructors&amp;amp;referringTitle=Features%20supported"&gt;constructors&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Coalesce&lt;/li&gt;&lt;li&gt;Nullable structures&lt;/li&gt;&lt;li&gt;Extern methods&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Directly pointing to user defined C++ method&lt;/li&gt;&lt;li&gt;Also used during PInvoke.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Keyword collision (corresponds to @label in C#)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Garbage%20Collector&amp;amp;referringTitle=Features%20supported"&gt;GC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Unsafe code (mostly supported)&lt;/li&gt;&lt;li&gt;Finalizers&lt;/li&gt;&lt;li&gt;Static constructors&lt;/li&gt;&lt;li&gt;Anonymous methods&lt;/li&gt;&lt;li&gt;Global namespace&lt;/li&gt;&lt;li&gt;Exceptions (Finally partially supported)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Sun, 14 Oct 2007 06:29:07 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Features supported 20071014062907A</guid></item><item><title>UPDATED WIKI: Overview</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Overview&amp;version=13</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Overview:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;CrossNet is composed of several layers:&lt;br /&gt; &lt;br /&gt;&lt;b&gt;CrossNetParser:&lt;/b&gt;&lt;br /&gt;This API reads a .NET assembly and generates unmanaged C++ files.&lt;br /&gt;CrossNetParser is based on top of Reflector, an Add-In is provided.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;CrossNetRuntime:&lt;/b&gt;&lt;br /&gt;This C++ library is the core of CrossNet. You must compile and link this library against your generated C++ files.&lt;br /&gt;CrossNetRuntime has a list of &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=predefined%20.NET%20types&amp;amp;referringTitle=Overview"&gt;predefined .NET types&lt;/a&gt; already. The user cannot override them directly (except by changing CrossNetRuntime sources).&lt;br /&gt; &lt;br /&gt;&lt;u&gt;Additional things that you will need:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;You will have to provide your own implementation of &lt;b&gt;BCL&lt;/b&gt; (Base Class Library - like collections, Console, Diagnostics, etc...).&lt;br /&gt;Your assembly will certainly need this BCL assembly to be able to compile and link. You can provide the BCL in several manners:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Use CrossNetSystem implementation&lt;/b&gt;. &lt;a href="http://www.codeplex.com/crossnetsystem" class="externalLink"&gt;CrossNetSystem&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; is another open source project. As of September 2007, this is not yet recommended as the very few classes are supported, and the implementation is certainly not correct. But it is expected to improve over time.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Use Mono's implementation&lt;/b&gt;. You can use CrossNetParser to transform Mono's BCL in C++, and integrate it in your process. I believe the Mono's license let you do that, you will have to check though.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Write your own.&lt;/b&gt; This is a huge task, you really don't want to do that (but that's your choice). It would be better if you were contributing to CrossNetSystem.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;Note that if you are implementing BCL (or any other class) in C++, you take the risk for your code to be broken if CrossNet's API change.&lt;br /&gt;You won't have this issue if you are using C#.&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Please do not disassemble Microsoft's BCL implementation (with CrossNet or anything else). I don't think you have the rights. Please don't do it.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;In any case, there will be some technical issues - First CrossNetParser would generate incorrect C++ code in the most complex cases&lt;/b&gt;&lt;br /&gt;&lt;b&gt;of the Microsoft assemblies, and also one would have to implement many external methods. A lot of time will be spent modifying by hand the generated C++ code.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Instead, please contribute to CrossNetSystem.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;Before you can execute any code in your assembly, you will also have to initialize CrossNetRuntime.&lt;br /&gt;This initialization is mostly setting up the memory buffers and few callbacks, as well as implement the class System.Type.&lt;br /&gt; &lt;br /&gt;You can find here more details:&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;How do I get &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=started&amp;amp;referringTitle=Overview"&gt;started&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=generating%20CPlusCplus&amp;amp;referringTitle=Overview"&gt;Why generate C++&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;Can you describe the &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=workflow&amp;amp;referringTitle=Overview"&gt;workflow&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;How do I use &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=several%20assemblies&amp;amp;referringTitle=Overview"&gt;several assemblies&lt;/a&gt; together?&lt;/li&gt;&lt;li&gt;How does the &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Garbage%20Collector&amp;amp;referringTitle=Overview"&gt;Garbage Collector&lt;/a&gt; work?&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=What%20about%20.NET%203.0%20and%20later&amp;amp;referringTitle=Overview"&gt;What about .NET 3.0 and later&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;Do you have some &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=benchmarks&amp;amp;referringTitle=Overview"&gt;benchmarks&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;What is the &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=memory%20usage&amp;amp;referringTitle=Overview"&gt;memory usage&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;How can I &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=contribute&amp;amp;referringTitle=Overview"&gt;contribute&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;Do you have some &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=unit-tests&amp;amp;referringTitle=Overview"&gt;unit-tests&lt;/a&gt;?&lt;/li&gt;&lt;li&gt;How can I create my own &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=user%27s%20policy&amp;amp;referringTitle=Overview"&gt;user's policy&lt;/a&gt; in the parser?&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Examples%20of%20generated%20code&amp;amp;referringTitle=Overview"&gt;Examples of generated code&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;If you have more questions (I'm sure you do), you can look at the code, examples, and unit-tests.&lt;br /&gt;Don't hesitate to use the forums as well.&lt;br /&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Sun, 14 Oct 2007 06:25:24 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Overview 20071014062524A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Home&amp;version=26</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;CrossNet is a cross platform .NET runtime.&lt;/b&gt;&lt;br /&gt;It parses .NET assemblies and generates unmanaged C++ code that can be compiled on any standard C++ compiler.&lt;br /&gt; &lt;br /&gt;More than 95% of the .NET 2.0 features are actually &amp;quot;emulated&amp;quot; in C++. CrossNet does &lt;b&gt;not&lt;/b&gt; produce managed C++, the generated code is pure ANSI C++.&lt;br /&gt;Even if that's only an emulation of .NET, the performance and memory usage are usually in the same range as C++ / .NET.&lt;br /&gt;It is important to note that CrossNet's parser is a Reflector Add-In.&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Examples%20of%20generated%20code&amp;amp;referringTitle=Home"&gt;Examples of generated code&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;CrossNet is not the same thing as Mono:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;CrossNet emulates the .NET runtime but the goal is not to write the full .NET API. Some very rarely used features might not be emulated correctly.&lt;br /&gt;Some tiny portions of the BCL (Base Class Library) have been implemented in C++, but the purpose was mostly for the development of unit-tests.&lt;br /&gt;When using CrossNet, one must &lt;b&gt;provide some BCL implementation&lt;/b&gt; (or at least for the classes / methods used).&lt;br /&gt;One can either augment the CrossNet emulation of BCL by using &lt;a href="http://www.codeplex.com/crossnetsystem" class="externalLink"&gt;CrossNetSystem&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; (not recommended yet), use Mono's or write own  implementation.&lt;br /&gt; &lt;br /&gt;CrossNet can be used where .NET / Mono might not be the best fit:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;The platform is not standard and doesn't support .NET or Mono.&lt;/li&gt;&lt;li&gt;JIT cannot be implemented on the platform.&lt;/li&gt;&lt;li&gt;The platform has some memory constraints.&lt;/li&gt;&lt;li&gt;Best performance is needed and interpretation is not an option (i.e. Mint or MicroFramework might be too slow).&lt;/li&gt;&lt;li&gt;A simple code that can be customized and facilitate user's policy is a plus (memory tracking for example...).&lt;/li&gt;&lt;li&gt;There is a need for direct interaction with C++ code / compiler.&lt;/li&gt;&lt;li&gt;The code needs to be easily understandable and maintainable (or could be used to learn how .NET behavior can be emulated).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Important%20notes%21&amp;amp;referringTitle=Home"&gt;Important notes!&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Please look at the &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=overview&amp;amp;referringTitle=Home"&gt;overview&lt;/a&gt;, there is a lot more information and links there!&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20supported&amp;amp;referringTitle=Home"&gt;Features supported&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features to be supported soon&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20not%20expected%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features not expected to be supported soon&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Sun, 14 Oct 2007 06:21:29 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20071014062129A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Home&amp;version=25</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;CrossNet is a cross platform .NET runtime.&lt;/b&gt;&lt;br /&gt;It parses .NET assemblies and generates unmanaged C++ code that can be compiled on any standard C++ compiler.&lt;br /&gt; &lt;br /&gt;More than 95% of the .NET 2.0 features are actually &amp;quot;emulated&amp;quot; in C++. CrossNet does &lt;b&gt;not&lt;/b&gt; produce managed C++, the generated code is pure ANSI C++.&lt;br /&gt;Even if that's only an emulation of .NET, the performance and memory usage are usually in the same range as C++ / .NET.&lt;br /&gt;It is important to note that CrossNet is using Reflector's public API &lt;i&gt;(undocumented)&lt;/i&gt;.&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Examples%20of%20generated%20code&amp;amp;referringTitle=Home"&gt;Examples of generated code&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;CrossNet is not the same thing as Mono:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;CrossNet emulates the .NET runtime but the goal is not to write the full .NET API. Some very rarely used features might not be emulated correctly.&lt;br /&gt;Some tiny portions of the BCL (Base Class Library) have been implemented in C++, but the purpose was mostly for the development of unit-tests.&lt;br /&gt;When using CrossNet, one must &lt;b&gt;provide some BCL implementation&lt;/b&gt; (or at least for the classes / methods used).&lt;br /&gt;One can either augment the CrossNet emulation of BCL by using &lt;a href="http://www.codeplex.com/crossnetsystem" class="externalLink"&gt;CrossNetSystem&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; (not recommended yet), use Mono's implementation or write his/her own.&lt;br /&gt; &lt;br /&gt;CrossNet can be used where .NET / Mono might not be the best fit:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;The platform is not standard and doesn't support .NET or Mono.&lt;/li&gt;&lt;li&gt;JIT cannot be implemented on the platform.&lt;/li&gt;&lt;li&gt;The platform has some memory constraints.&lt;/li&gt;&lt;li&gt;Best performance is needed and interpretation is not an option (i.e. Mint or MicroFramework might be too slow).&lt;/li&gt;&lt;li&gt;A simple code that can be customized and facilitate user's policy is a plus (memory tracking for example...).&lt;/li&gt;&lt;li&gt;There is a need for direct interaction with C++ code / compiler.&lt;/li&gt;&lt;li&gt;The code needs to be easily understandable and maintainable (or could be used to learn how .NET behavior can be emulated).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Important%20notes%21&amp;amp;referringTitle=Home"&gt;Important notes!&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Please look at the &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=overview&amp;amp;referringTitle=Home"&gt;overview&lt;/a&gt;, there is a lot more information and links there!&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20supported&amp;amp;referringTitle=Home"&gt;Features supported&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features to be supported soon&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20not%20expected%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features not expected to be supported soon&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 01 Oct 2007 05:50:48 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20071001055048A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Home&amp;version=24</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;CrossNet is a cross platform .NET runtime. It parses .NET assemblies and generates unmanaged C++ code that can be compiled on any standard C++ compiler.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;More than 95% of the .NET 2.0 features are actually &amp;quot;emulated&amp;quot; in C++. CrossNet does &lt;b&gt;not&lt;/b&gt; produce managed C++, the generated code is pure ANSI C++.&lt;br /&gt;Even if that's only an emulation of .NET, the performance and memory usage are usually in the same range as C++ / .NET.&lt;br /&gt;It is important to note that CrossNet is using Reflector's public API &lt;i&gt;(undocumented)&lt;/i&gt;.&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Examples%20of%20generated%20code&amp;amp;referringTitle=Home"&gt;Examples of generated code&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;CrossNet is not the same thing as Mono:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;CrossNet emulates the .NET runtime but the goal is not to write the full .NET API. Some very rarely used features might not be emulated correctly.&lt;br /&gt;Some tiny portions of the BCL (Base Class Library) have been implemented in C++, but the purpose was mostly for the development of unit-tests.&lt;br /&gt;When using CrossNet, one must &lt;b&gt;provide some BCL implementation&lt;/b&gt; (or at least for the classes / methods used).&lt;br /&gt;One can either augment the CrossNet emulation of BCL by using &lt;a href="http://www.codeplex.com/crossnetsystem" class="externalLink"&gt;CrossNetSystem&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; (not recommended yet), use Mono's implementation or write his/her own.&lt;br /&gt; &lt;br /&gt;CrossNet can be used where .NET / Mono might not be the best fit:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;The platform is not standard and doesn't support .NET or Mono.&lt;/li&gt;&lt;li&gt;JIT cannot be implemented on the platform.&lt;/li&gt;&lt;li&gt;The platform has some memory constraints.&lt;/li&gt;&lt;li&gt;Best performance is needed and interpretation is not an option (i.e. Mint or MicroFramework might be too slow).&lt;/li&gt;&lt;li&gt;A simple code that can be customized and facilitate user's policy is a plus (memory tracking for example...).&lt;/li&gt;&lt;li&gt;There is a need for direct interaction with C++ code / compiler.&lt;/li&gt;&lt;li&gt;The code needs to be easily understandable and maintainable (or could be used to learn how .NET behavior can be emulated).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Important%20notes%21&amp;amp;referringTitle=Home"&gt;Important notes!&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Please look at the &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=overview&amp;amp;referringTitle=Home"&gt;overview&lt;/a&gt;, there is a lot more information and links there!&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20supported&amp;amp;referringTitle=Home"&gt;Features supported&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features to be supported soon&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20not%20expected%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features not expected to be supported soon&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 01 Oct 2007 05:46:17 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20071001054617A</guid></item><item><title>UPDATED WIKI: Home</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Home&amp;version=23</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;CrossNet parses .NET assemblies and generates unmanaged C++ code that can be compiled on any standard C++ compiler. That makes CrossNet a cross platform .NET runtime.&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;More than 95% of the .NET 2.0 features are actually &amp;quot;emulated&amp;quot; in C++. CrossNet does &lt;b&gt;not&lt;/b&gt; produce managed C++, the generated code is pure ANSI C++.&lt;br /&gt;Even if that's only an emulation of .NET, the performance and memory usage are usually in the same range as C++ / .NET.&lt;br /&gt;It is important to note that CrossNet is using Reflector's public API &lt;i&gt;(undocumented)&lt;/i&gt;.&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Examples%20of%20generated%20code&amp;amp;referringTitle=Home"&gt;Examples of generated code&lt;/a&gt;.&lt;br /&gt; &lt;br /&gt;&lt;u&gt;CrossNet is not the same thing as Mono:&lt;/u&gt;&lt;br /&gt; &lt;br /&gt;CrossNet emulates the .NET runtime but the goal is not to write the full .NET API. Some very rarely used features might not be emulated correctly.&lt;br /&gt;Some tiny portions of the BCL (Base Class Library) have been implemented in C++, but the purpose was mostly for the development of unit-tests.&lt;br /&gt;When using CrossNet, one must &lt;b&gt;provide some BCL implementation&lt;/b&gt; (or at least for the classes / methods used).&lt;br /&gt;One can either augment the CrossNet emulation of BCL by using &lt;a href="http://www.codeplex.com/crossnetsystem" class="externalLink"&gt;CrossNetSystem&lt;span class="externalLinkIcon"&gt;&lt;/span&gt;&lt;/a&gt; (not recommended yet), use Mono's implementation or write his/her own.&lt;br /&gt; &lt;br /&gt;CrossNet can be used where .NET / Mono might not be the best fit:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;The platform is not standard and doesn't support .NET or Mono.&lt;/li&gt;&lt;li&gt;JIT cannot be implemented on the platform.&lt;/li&gt;&lt;li&gt;The platform has some memory constraints.&lt;/li&gt;&lt;li&gt;Best performance is needed and interpretation is not an option (i.e. Mint or MicroFramework might be too slow).&lt;/li&gt;&lt;li&gt;A simple code that can be customized and facilitate user's policy is a plus (memory tracking for example...).&lt;/li&gt;&lt;li&gt;There is a need for direct interaction with C++ code / compiler.&lt;/li&gt;&lt;li&gt;The code needs to be easily understandable and maintainable (or could be used to learn how .NET behavior can be emulated).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Important%20notes%21&amp;amp;referringTitle=Home"&gt;Important notes!&lt;/a&gt;&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Please look at the &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=overview&amp;amp;referringTitle=Home"&gt;overview&lt;/a&gt;, there is a lot more information and links there!&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20supported&amp;amp;referringTitle=Home"&gt;Features supported&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features to be supported soon&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features%20not%20expected%20to%20be%20supported%20soon&amp;amp;referringTitle=Home"&gt;Features not expected to be supported soon&lt;/a&gt;&lt;br /&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 01 Oct 2007 05:17:45 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Home 20071001051745A</guid></item><item><title>UPDATED WIKI: To do!</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=To do!&amp;version=31</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Backlog:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;From now on, I'm going to use the issue tracker for the status of my work.&lt;br /&gt;This page is now just my backlog of things I shoud do one day as lower priority.&lt;br /&gt;Don't hesitate to move some of these on the issue tracker if you feel that they are important!&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Missing features / Bugs:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Review buffer construct of co8705constains_obj&lt;/li&gt;&lt;li&gt;Must add tracing in Hashtable and Enumerator if not done already.&lt;/li&gt;&lt;li&gt;+ with pointers with one of them is casted with reinterpret_cast&amp;lt;T *&amp;gt;. We might create this issue during the parsing.&lt;/li&gt;&lt;li&gt;Fix issue when a derived class method hides a method from the base class. -&amp;gt; Make LinkedResource unit test work again&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;I guess the solution would be detect the hidden function and use the C++ keyword &amp;quot;using&amp;quot; to make them reachable. That's not pretty nor efficient at parsing time. :(&lt;/li&gt;&lt;li&gt;The other solution is to cast to the base type during the call.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Improve test&lt;i&gt;16 / test&lt;/i&gt;88 / event_tests&lt;/li&gt;&lt;li&gt;Handle int * * p correctly.&lt;/li&gt;&lt;li&gt;Detect memory leaks after shutdown&lt;/li&gt;&lt;li&gt;Investigate why we need 40 MB or so to run and not 15 MB when running the benchmark. (Bug in GC / or simply due to fragmentation?)&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Low priority:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Add support for typeof(X&amp;lt;&amp;gt;) with X&amp;lt;&amp;gt; representing the generic type and not a specific implementation.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Actually I'm wondering what is the interest of supporting this if we don't have reflection nor dynamic type generation.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Checked is not supported&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Probably will never be supported.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Interestingly int * [] is partially supported in .NET. We can't convert an item to object. (BTW that's exactly where Crossnet fails to compile - Could we solve it by some traits?).&lt;/li&gt;&lt;li&gt;Handle __arglist, __makeref, __reftype, __refvalue. See if Reflector handles that correctly now.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;These should only be used in managed C++, not a common usage.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Improve switch on strings, there is currently an extremely small probability that the switch / case doesn't behave correctly. Unit tests added to list the various implementations.&lt;/li&gt;&lt;li&gt;Implement GenerateCodeArgumentList() in System::String::Concat()&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Reflector:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Reflector is missing the conversion to 64 bits, like in System.IO.BinaryReader.ReadInt64.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with some fixed syntax (with C# code like fixed (void * buffer = intArray) ...)&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with ++ (TestString / test_42) - This issue doesn't seem to happen when the assembly is compiled in debug and overflow check is off.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with ++ with unsafe pointers. This issue seems to happen even in debug and overflow check is off.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Didn't send to Lutz yet, waiting for the ++ fix above to see if this is going to fix this issue as well.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with properties get / set with ++ and return value (like return (MyProp++); This is actually a get, +1, dup, set and return. In some cases, Reflector returns invalid code and CrossNet doesn't recover.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Issue with CrossNet and Reflector. Will have to figure this out later when ++ is solved in general.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;In optimized assembly, with new U() where U is a generic type is not disassembled correctly.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Optimizations:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Readonly should be const for primitive types. Like BitConverter.IsLittleEndian.&lt;/li&gt;&lt;li&gt;Improve parsing to get rid of the empty function &lt;i&gt;_Trace_&lt;/i&gt; (if there is no traceable fields in the class).&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Could detect that during GetDependencies()&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Add perm allocations (like for global strings or types). Do not trace them...&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Although generational would pretty much do the same.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Const int should be declared in headers instead of cpp.&lt;/li&gt;&lt;li&gt;Detect cases where cast result is known and a fast cast is acceptable&lt;/li&gt;&lt;li&gt;Remove virtual call (fully qualify the type?) for sealed classes&lt;/li&gt;&lt;li&gt;Clarify usage of delegate and multi-cast delegate / optimize.&lt;/li&gt;&lt;li&gt;Add dictionary in Provider.cs / GetEmbeddedType().&lt;/li&gt;&lt;li&gt;When a struct explictly implements a method of an interface, it will mark the function as virtual. No method should be virtual in a struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;The issue is the same for classes. Is it the intended behavior even for a class?&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Make sure handler for event is not duplicated.&lt;/li&gt;&lt;li&gt;Use traits for generic code when doing an interface call on a struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;As structs can't be overriden, the interface method could be known at compile time and handled correctly by traits.&lt;/li&gt;&lt;li&gt;There is some work regarding the macro for interface call, but it would mean interface call on a struct in a generic would be as fast as a normal call.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Trace the static members on a generic only one time (and not for every instance).&lt;/li&gt;&lt;li&gt;Find ways to get rid of the original anonymous method / class as it's duplicated.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Refactoring / Cleaning:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;See if we can Deactivate -&amp;gt;() for the structures.&lt;/li&gt;&lt;li&gt;typedef void * InterfaceMap;&lt;/li&gt;&lt;li&gt;Look for [=]. We should be able to remove this marker.&lt;/li&gt;&lt;li&gt;Find a way to simplify crossnet_box / unbox struct boxing / unboxing&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 01 Oct 2007 05:13:10 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: To do! 20071001051310A</guid></item><item><title>UPDATED WIKI: Generics</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Generics&amp;version=4</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Generics&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;Generics are much more complicated than what they seem. They are not Java syntactic sugar, .NET JIT actually understands generics and do great things with it.&lt;br /&gt;CrossNet uses C++ templates to emulate generics. There are some limitations though, but in most cases you probably won't notice them.&lt;br /&gt;Fortunately C++ templates are more lenient that .NET generics, so constraints are actually not needed (but we could actually use them to do some optimizations).&lt;br /&gt; &lt;br /&gt;First let's talk about what is not supported by CrossNet:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
class TestGenericVirtual
{
    public virtual T Foo&amp;lt;T&amp;gt;(T a)
    {
        return (a);
    }
}
&lt;/pre&gt; &lt;br /&gt;The reason is that in C++, virtual functions can't be templated.&lt;br /&gt; &lt;br /&gt;And by extension, this is not supported:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
interface ITestGenericMethod
{
    string Foo&amp;lt;V&amp;gt;(string a, V b);
}
&lt;/pre&gt; &lt;br /&gt;Interfaces are emulated with abstract classes, all the methods in the interface are also abstract. The interface itself can be generic.&lt;br /&gt; &lt;br /&gt;So this is perfectly supported:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
interface ITestSimpleGenericInterface&amp;lt;U&amp;gt;
{
    U Foo(U a);
}
&lt;/pre&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;The two other unsupported cases are:&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Generic types dynamically created (doesn't fit well with statically compiled templates ;).&lt;/li&gt;&lt;li&gt;Static members for generic types (Will be supported with next change set around end of September).&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt;Also note that .NET supports overloading of name for generics, the number of generic arguments differentiates the class / method (there is no default parameter in .NET).&lt;br /&gt; &lt;br /&gt;Example of C# code:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
public class Foo
{
    public void Bar()
    {
    }
    public void Bar&amp;lt;X&amp;gt;()
    {
    }
    public void Bar&amp;lt;X, Y&amp;gt;()
    {
    }
    public void Bar&amp;lt;X, Y, Z&amp;gt;()
    {
    }
}
&lt;/pre&gt; &lt;br /&gt;Generated C++ code:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
class TestGenericCollision__Foo : public ::System::Object
{
    ...
    public:
    ::System::Void Bar();
    public:
    template &amp;lt;typename X&amp;gt;
    ::System::Void Bar__G1();
    public:
    template &amp;lt;typename X, typename Y&amp;gt;
    ::System::Void Bar__G2();
    public:
    template &amp;lt;typename X, typename Y, typename Z&amp;gt;
    ::System::Void Bar__G3();
    ...
};
&lt;/pre&gt; &lt;br /&gt;As you can see __G? (where ? represents the number of generic arguments) is appended to differentiate the generic from the non-generic function.&lt;br /&gt;You can have some very complicated syntax but CrossNet is hiding everything for you.&lt;br /&gt; &lt;br /&gt;CrossNet manages creation of System.Type, interface map, interface ID dynamically for generic types.&lt;br /&gt; &lt;br /&gt;C# Code:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
static public void gmeth1&amp;lt;T&amp;gt;()
{
    Console.WriteLine(typeof(Set&amp;lt;T&amp;gt;));
    Console.WriteLine(typeof(Map&amp;lt;T, T&amp;gt;));
    Console.WriteLine(typeof(T));
    gmeth2&amp;lt;T, Set&amp;lt;T&amp;gt;&amp;gt;();
    gmeth2&amp;lt;Set&amp;lt;T&amp;gt;, T&amp;gt;();
}
&lt;/pre&gt; &lt;br /&gt;Generated C++ code:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
template &amp;lt;typename T&amp;gt;
::System::Void CrossNetUnitTest::Generic::TestRegressionGenmeth4__M::gmeth1__G1()
{
    ::System::Console::WriteLine(CN_TYPEOF(::CrossNetUnitTest::Generic::TestRegressionGenmeth4__Set__G1&amp;lt;T&amp;gt;));
    ::System::Console::WriteLine(CN_TYPEOF(::CrossNetUnitTest::Generic::TestRegressionGenmeth4__Map__G2&amp;lt;__W2__(T, T)&amp;gt;));
    ::System::Console::WriteLine(CN_TYPEOF(T));
    ::CrossNetUnitTest::Generic::TestRegressionGenmeth4__M::gmeth2__G2&amp;lt;__W2__(T, ::CrossNetUnitTest::Generic::TestRegressionGenmeth4__Set__G1&amp;lt;T&amp;gt; *)&amp;gt;();
    ::CrossNetUnitTest::Generic::TestRegressionGenmeth4__M::gmeth2__G2&amp;lt;__W2__(::CrossNetUnitTest::Generic::TestRegressionGenmeth4__Set__G1&amp;lt;T&amp;gt; *, T)&amp;gt;();
}
&lt;/pre&gt; &lt;br /&gt;Note the macro CN_TYPEOF to get the corresponding System::Type object from the C++ type.&lt;br /&gt;The macro &lt;i&gt;_W?_&lt;/i&gt; is just a wrapper around the template parameters. We are using the wrapper macro because C++ macros don't recognize &amp;lt; &amp;gt; to describe template parameters as partitioner.&lt;br /&gt; &lt;br /&gt;So this would not compile:&lt;br /&gt; &lt;br /&gt;&lt;pre&gt;
    ::System::Console::WriteLine(CN_TYPEOF(::CrossNetUnitTest::Generic::TestRegressionGenmeth4__Map__G2&amp;lt;T, T&amp;gt;));
&lt;/pre&gt; &lt;br /&gt;Because the preprocessor would undertand it as 2 parameters for the macro CN_TYPEOF that can receive only one parameter.&lt;br /&gt;I guess we could use variadic macros to get around that but not all C++ compiler does support it.&lt;br /&gt; &lt;br /&gt;Finally there are much more tricks to make the generics work, but I will describe them later...&lt;br /&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 24 Sep 2007 04:56:43 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Generics 20070924045643A</guid></item><item><title>UPDATED WIKI: Features supported</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features supported&amp;version=10</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Features supported (with .NET 2.0 as base):&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Delegates&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Interfaces&amp;amp;referringTitle=Features%20supported"&gt;Interfaces&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Generics&amp;amp;referringTitle=Features%20supported"&gt;Generics&lt;/a&gt; (Some restrictions)&lt;/li&gt;&lt;li&gt;.NET &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Arrays&amp;amp;referringTitle=Features%20supported"&gt;Arrays&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Properties / indexers&lt;/li&gt;&lt;li&gt;.NET Strings / String pooling / Switch on strings&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Boxing&amp;amp;referringTitle=Features%20supported"&gt;Boxing&lt;/a&gt; / Unboxing&lt;/li&gt;&lt;li&gt;Variable size &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=enums&amp;amp;referringTitle=Features%20supported"&gt;enums&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Foreach and enumerators&lt;/li&gt;&lt;li&gt;is / as / cast / GetType() / typeof&lt;/li&gt;&lt;li&gt;Events&lt;/li&gt;&lt;li&gt;.NET Operators&lt;/li&gt;&lt;li&gt;Method calls on primitive types&lt;/li&gt;&lt;li&gt;Virtual calls in &lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=constructors&amp;amp;referringTitle=Features%20supported"&gt;constructors&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Coalesce&lt;/li&gt;&lt;li&gt;Nullable structures&lt;/li&gt;&lt;li&gt;Extern methods&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Directly pointing to user defined C++ method&lt;/li&gt;&lt;li&gt;Also used during PInvoke.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Keyword collision (corresponds to @label in C#)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Garbage%20Collector&amp;amp;referringTitle=Features%20supported"&gt;GC&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Unsafe code (mostly supported)&lt;/li&gt;&lt;li&gt;Finalizers&lt;/li&gt;&lt;li&gt;Static constructors&lt;/li&gt;&lt;li&gt;Exceptions (Finally partially supported)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 24 Sep 2007 04:42:27 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Features supported 20070924044227A</guid></item><item><title>UPDATED WIKI: Features to be supported soon</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=Features to be supported soon&amp;version=5</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;Features to be supported (soon):&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Asynchronous delegates&lt;/li&gt;&lt;li&gt;Anonymous methods&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Will be supported with next change set (around end of September).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Some uncommon fixed syntax&lt;/li&gt;&lt;li&gt;GC defragmentation / generational&lt;/li&gt;&lt;li&gt;__arglist, __makeref, __reftype, __refvalue&lt;/li&gt;&lt;li&gt;Static constructors for generic types&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Will be supported with next change set (around end of September).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;ToString() on enum values / type&lt;/li&gt;&lt;li&gt;Weak references&lt;/li&gt;&lt;li&gt;Global namespace&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Will be supported with next change set (around end of September).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Full exceptions&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Will be supported with next change set (around end of September).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Exceptions with implementation not using C++ exceptions.&lt;/li&gt;&lt;li&gt;Exceptions for null dereference, divide by zero, etc...&lt;/li&gt;&lt;li&gt;StructLayout&lt;/li&gt;&lt;li&gt;Operations with System.Enum&lt;/li&gt;&lt;li&gt;Numerous bug fixes (and more complex unit tests to pass)&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 24 Sep 2007 04:41:03 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: Features to be supported soon 20070924044103A</guid></item><item><title>UPDATED WIKI: To do!</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=To do!&amp;version=30</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;TO DO list:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;That's my list of items I'm working on.&lt;br /&gt;Assume that anything listed here just doesn't work (just so I set your expectations low ;)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Missing features / Bugs:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implement remaining functions for Array, String and StringBuilder. Those classes can't be overriden by the user.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Currently only a very minimum set is implemented (and not thoroughly tested).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Review buffer construct of co8705constains_obj&lt;/li&gt;&lt;li&gt;Must add tracing in Hashtable and Enumerator if not done already.&lt;/li&gt;&lt;li&gt;+ with pointers with one of them is casted with reinterpret_cast&amp;lt;T *&amp;gt;. We might create this issue during the parsing.&lt;/li&gt;&lt;li&gt;Fix issue when a derived class method hides a method from the base class. -&amp;gt; Make LinkedResource unit test work again&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;I guess the solution would be detect the hidden function and use the C++ keyword &amp;quot;using&amp;quot; to make them reachable. That's not pretty nor efficient at parsing time. :(&lt;/li&gt;&lt;li&gt;The other solution is to cast to the base type during the call.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Improve test&lt;i&gt;16 / test&lt;/i&gt;88 / event_tests&lt;/li&gt;&lt;li&gt;Asynchronous delegates&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Need thread safety first though. We could actually accept the convention call, and call it just synchronously at first.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Handle int * * p correctly.&lt;/li&gt;&lt;li&gt;Implement finally with exceptions. catch is surrounded by another try catch. The sub-catch call the finally statement then throw the exception again.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Done, but finally is currently not called if there is a return statement :( More work needed...&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Implement ToString() for enum values / type&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Don't know how critical this really is.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Detect memory leaks after shutdown&lt;/li&gt;&lt;li&gt;Investigate why we need 40 MB or so to run and not 15 MB when running the benchmark. (Bug in GC / or simply due to fragmentation?)&lt;/li&gt;&lt;li&gt;Add unit-test for anonymous methods and generic types.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Low priority:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Add support for typeof(X&amp;lt;&amp;gt;) with X&amp;lt;&amp;gt; representing the generic type and not a specific implementation.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Actually I'm wondering what is the interest of supporting this if we don't have reflection nor dynamic type generation.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Checked is not supported&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Probably will never be supported.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Implement weak references.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Probably tied to moving GC.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Interestingly int * [] is partially supported in .NET. We can't convert an item to object. (BTW that's exactly where Crossnet fails to compile - Could we solve it by some traits?).&lt;/li&gt;&lt;li&gt;Handle __arglist, __makeref, __reftype, __refvalue. See if Reflector handles that correctly now.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;These should only be used in managed C++, not a common usage.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Improve switch on strings, there is currently an extremely small probability that the switch / case doesn't behave correctly. Unit tests added to list the various implementations.&lt;/li&gt;&lt;li&gt;Implement GenerateCodeArgumentList() in System::String::Concat()&lt;/li&gt;&lt;li&gt;StructLayout&lt;/li&gt;&lt;li&gt;Enum as base class.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Reflector:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Reflector is missing the conversion to 64 bits, like in System.IO.BinaryReader.ReadInt64.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with some fixed syntax (with C# code like fixed (void * buffer = intArray) ...)&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with ++ (TestString / test_42) - This issue doesn't seem to happen when the assembly is compiled in debug and overflow check is off.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with ++ with unsafe pointers. This issue seems to happen even in debug and overflow check is off.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Didn't send to Lutz yet, waiting for the ++ fix above to see if this is going to fix this issue as well.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with properties get / set with ++ and return value (like return (MyProp++); This is actually a get, +1, dup, set and return. In some cases, Reflector returns invalid code and CrossNet doesn't recover.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Issue with CrossNet and Reflector. Will have to figure this out later when ++ is solved in general.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;In optimized assembly, with new U() where U is a generic type is not disassembled correctly.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Optimizations:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Readonly should be const for primitive types. Like BitConverter.IsLittleEndian.&lt;/li&gt;&lt;li&gt;Improve parsing to get rid of the empty function &lt;i&gt;_Trace_&lt;/i&gt; (if there is no traceable fields in the class).&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Could detect that during GetDependencies()&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Implement moving GC&lt;/li&gt;&lt;li&gt;Implement generational GC&lt;/li&gt;&lt;li&gt;Add perm allocations (like for global strings or types). Do not trace them...&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Although generational would pretty much do the same.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Add flag for finalizer? Revisit finalizers.&lt;/li&gt;&lt;li&gt;Const int should be declared in headers instead of cpp.&lt;/li&gt;&lt;li&gt;Detect cases where cast result is known and a fast cast is acceptable&lt;/li&gt;&lt;li&gt;Remove virtual call (fully qualify the type?) for sealed classes&lt;/li&gt;&lt;li&gt;Clarify usage of delegate and multi-cast delegate / optimize.&lt;/li&gt;&lt;li&gt;Add dictionary in Provider.cs / GetEmbeddedType().&lt;/li&gt;&lt;li&gt;When a struct explictly implements a method of an interface, it will mark the function as virtual. No method should be virtual in a struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;The issue is the same for classes. Is it the intended behavior even for a class?&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Make sure handler for event is not duplicated.&lt;/li&gt;&lt;li&gt;Use traits for generic code when doing an interface call on a struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;As structs can't be overriden, the interface method could be known at compile time and handled correctly by traits.&lt;/li&gt;&lt;li&gt;There is some work regarding the macro for interface call, but it would mean interface call on a struct in a generic would be as fast as a normal call.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Trace the static members on a generic only one time (and not for every instance).&lt;/li&gt;&lt;li&gt;Find ways to get rid of the original anonymous method / class as it's duplicated.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Refactoring / Cleaning:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;See if we can Deactivate -&amp;gt;() for the structures.&lt;/li&gt;&lt;li&gt;typedef void * InterfaceMap;&lt;/li&gt;&lt;li&gt;Look for [=]. We should be able to remove this marker.&lt;/li&gt;&lt;li&gt;Find a way to simplify crossnet_box / unbox struct boxing / unboxing&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Done: (to be released with next change set - around end of September)&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implemented default Equals() on struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Implemented correct Equals() and GetHashCode() as well for objects as I misinterpreted the behavior. Added unit-tests to validate that.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Class deriving from an instantiated generic interface compiles (wrapper used typename but we were not in a template definition).&lt;/li&gt;&lt;li&gt;Class deriving from the same interface multiple times (like IEnumerable&amp;lt;int&amp;gt; and IEnumerable&amp;lt;double&amp;gt;) is now handled properly.&lt;/li&gt;&lt;li&gt;Found the correct order between GetEnumerator(), IEnumerator and IEnumerator() in foreach statement&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Unit test completely enabled as issues fixed above are fixed.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Fixed case where explicit interface could be shadowed by implicit implementation of an interface method.&lt;/li&gt;&lt;li&gt;Strings with embedded '\0' are now initialized correctly.&lt;/li&gt;&lt;li&gt;Global namespace is now handled correctly.&lt;/li&gt;&lt;li&gt;Fixed issue with op&lt;i&gt;Explicit&lt;/i&gt;IntPtr from void *&lt;/li&gt;&lt;li&gt;Fixed implicit cast with generics; the generated function name was incorrect.&lt;/li&gt;&lt;li&gt;Array::TestArraysClass__TestRef now compiles correctly when the assembly is compiled in release.&lt;/li&gt;&lt;li&gt;Cleaned generation of arrays and template so &amp;quot;&amp;gt;&amp;gt;&amp;quot; is not generated in the incorrect places.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;(VC++ 2005 compiles correctly with two nested templates - !- but I don't think it's ANSI C++).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Added unit-test to compare content / hashcode between boxed / unboxed type (primitive type, enums, user struct, generic user struct, strings).&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;IEquatable is part of the test as well... The test is done using a generic to test things even further.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;T[] implements correctly IList&amp;lt;T&amp;gt;, IList, ICollection, ICloneable. Unit-tests added (mostly covered). Still have IEnumerable and IEnumerable&amp;lt;&amp;gt; to finalize.&lt;/li&gt;&lt;li&gt;Finished to rename types with __ when they were encapsulated in the namespace CrossNetRuntime.&lt;/li&gt;&lt;li&gt;Added unit test for struct + interface call / Boxed object.&lt;/li&gt;&lt;li&gt;Improved unit-test for struct construction (regarding declaration / static field initialization / field initialization / inherited constructor).&lt;/li&gt;&lt;li&gt;Fixed typeof in generics, now one macro encapsulates correctly primitive types, structures and classes, with generics it was previously impossible to determine the correct macro.&lt;/li&gt;&lt;li&gt;Added CrossNetRuntime::Tracer::DoTrace() helper method to trace objects (very useful for generic members).&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;It uses traits, so that's resolved at compile time and is a no-op where there is no need to trace.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Handled static constructors and static members for generic types.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;For the concerned generics, static constructors are called at every construction (and a flag make sure that we call the init only one time).&lt;/li&gt;&lt;li&gt;The current implementation is limited, it &lt;i&gt;might&lt;/i&gt; create link errors if several assemblies using the generic with static constructors are compiled in different obj files. This can be improved later as needed.&lt;/li&gt;&lt;li&gt;Currently static members are traced when we are tracing each instance (that mean they can be traced several times). This will be optimized over time.&lt;/li&gt;&lt;li&gt;Accessing directly static members of a generic type may not return a correct result if a corresponding generic instance has not been created earlier (static constructor is called at instance creation).&lt;/li&gt;&lt;li&gt;Beside adding a check before each static member access I don't think there is an easy fix.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Anonymous methods are now supported!&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;There was more work than expected as I ended up having to generate what the C# compiler does. Pretty nice design though, very transparent for the user. Lot of work for the compiler ;)&lt;/li&gt;&lt;li&gt;Expect some issues if the declaring type is generic as I didn't test that yet. Should be easy to fix though.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Re-enabled Mono's unit tests.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;55 unit tests have been disabled on around 230 unit-tests. The reason is because the features are not supported yet: &lt;/li&gt;&lt;li&gt;Unit-tests using things like: Reflection, Multi-threading, exception on divide by zero, attributes, CodeGen, StructLayout, Asynchronous delegates, __arglist, DateTime implementation, support for nan.&lt;/li&gt;&lt;li&gt;All these features are already documented as not supported or in the to do list...&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 24 Sep 2007 04:38:54 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: To do! 20070924043854A</guid></item><item><title>UPDATED WIKI: To do!</title><link>http://www.codeplex.com/crossnet/Wiki/View.aspx?title=To do!&amp;version=29</link><description>&lt;div class="wikidoc"&gt;
&lt;b&gt;TO DO list:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;That's my list of items I'm working on.&lt;br /&gt;Assume that anything listed here just doesn't work (just so I set your expectations low ;)&lt;br /&gt; &lt;br /&gt;&lt;b&gt;Missing features / Bugs:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implement remaining functions for Array, String and StringBuilder. Those classes can't be overriden by the user.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Currently only a very minimum set is implemented (and not thoroughly tested).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Review buffer construct of co8705constains_obj&lt;/li&gt;&lt;li&gt;Must add tracing in Hashtable and Enumerator if not done already.&lt;/li&gt;&lt;li&gt;+ with pointers with one of them is casted with reinterpret_cast&amp;lt;T *&amp;gt;. We might create this issue during the parsing.&lt;/li&gt;&lt;li&gt;Fix issue when a derived class method hides a method from the base class. -&amp;gt; Make LinkedResource unit test work again&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;I guess the solution would be detect the hidden function and use the C++ keyword &amp;quot;using&amp;quot; to make them reachable. That's not pretty nor efficient at parsing time. :(&lt;/li&gt;&lt;li&gt;The other solution is to cast to the base type during the call.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Improve test&lt;i&gt;16 / test&lt;/i&gt;88 / event_tests&lt;/li&gt;&lt;li&gt;Asynchronous delegates&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Need thread safety first though. We could actually accept the convention call, and call it just synchronously at first.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Handle int * * p correctly.&lt;/li&gt;&lt;li&gt;Implement finally with exceptions. catch is surrounded by another try catch. The sub-catch call the finally statement then throw the exception again.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Done, but finally is currently not called if there is a return statement :( More work needed...&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Implement ToString() for enum values / type&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Don't know how critical this really is.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Detect memory leaks after shutdown&lt;/li&gt;&lt;li&gt;Investigate why we need 40 MB or so to run and not 15 MB when running the benchmark. (Bug in GC / or simply due to fragmentation?)&lt;/li&gt;&lt;li&gt;Add unit-test for anonymous methods and generic types.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Low priority:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Add support for typeof(X&amp;lt;&amp;gt;) with X&amp;lt;&amp;gt; representing the generic type and not a specific implementation.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Actually I'm wondering what is the interest of supporting this if we don't have reflection nor dynamic type generation.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Checked is not supported&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Probably will never be supported.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Implement weak references.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Probably tied to moving GC.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Interestingly int * [] is partially supported in .NET. We can't convert an item to object. (BTW that's exactly where Crossnet fails to compile - Could we solve it by some traits?).&lt;/li&gt;&lt;li&gt;Handle __arglist, __makeref, __reftype, __refvalue. See if Reflector handles that correctly now.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;These should only be used in managed C++, not a common usage.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Improve switch on strings, there is currently an extremely small probability that the switch / case doesn't behave correctly. Unit tests added to list the various implementations.&lt;/li&gt;&lt;li&gt;Implement GenerateCodeArgumentList() in System::String::Concat()&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Reflector:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Reflector is missing the conversion to 64 bits, like in System.IO.BinaryReader.ReadInt64.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with some fixed syntax (with C# code like fixed (void * buffer = intArray) ...)&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;test59 - Reflector doesn't return correctly signed int64&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with ++ (TestString / test_42) - This issue doesn't seem to happen when the assembly is compiled in debug and overflow check is off.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Sent to Lutz Roeder - Reflector&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with ++ with unsafe pointers. This issue seems to happen even in debug and overflow check is off.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;-&amp;gt; Didn't send to Lutz yet, waiting for the ++ fix above to see if this is going to fix this issue as well.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Issue with properties get / set with ++ and return value (like return (MyProp++); This is actually a get, +1, dup, set and return. In some cases, Reflector returns invalid code and CrossNet doesn't recover.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Issue with CrossNet and Reflector. Will have to figure this out later when ++ is solved in general.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;In optimized assembly, with new U() where U is a generic type is not disassembled correctly.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Optimizations:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Readonly should be const for primitive types. Like BitConverter.IsLittleEndian.&lt;/li&gt;&lt;li&gt;Improve parsing to get rid of the empty function &lt;i&gt;_Trace_&lt;/i&gt; (if there is no traceable fields in the class).&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Could detect that during GetDependencies()&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Implement moving GC&lt;/li&gt;&lt;li&gt;Implement generational GC&lt;/li&gt;&lt;li&gt;Add perm allocations (like for global strings or types). Do not trace them...&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Although generational would pretty much do the same.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Add flag for finalizer? Revisit finalizers.&lt;/li&gt;&lt;li&gt;Const int should be declared in headers instead of cpp.&lt;/li&gt;&lt;li&gt;Detect cases where cast result is known and a fast cast is acceptable&lt;/li&gt;&lt;li&gt;Remove virtual call (fully qualify the type?) for sealed classes&lt;/li&gt;&lt;li&gt;Clarify usage of delegate and multi-cast delegate / optimize.&lt;/li&gt;&lt;li&gt;Add dictionary in Provider.cs / GetEmbeddedType().&lt;/li&gt;&lt;li&gt;When a struct explictly implements a method of an interface, it will mark the function as virtual. No method should be virtual in a struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;The issue is the same for classes. Is it the intended behavior even for a class?&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Make sure handler for event is not duplicated.&lt;/li&gt;&lt;li&gt;Use traits for generic code when doing an interface call on a struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;As structs can't be overriden, the interface method could be known at compile time and handled correctly by traits.&lt;/li&gt;&lt;li&gt;There is some work regarding the macro for interface call, but it would mean interface call on a struct in a generic would be as fast as a normal call.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Trace the static members on a generic only one time (and not for every instance).&lt;/li&gt;&lt;li&gt;Find ways to get rid of the original anonymous method / class as it's duplicated.&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Refactoring / Cleaning:&lt;/b&gt;&lt;br /&gt; &lt;br /&gt;&lt;ul&gt;
&lt;li&gt;See if we can Deactivate -&amp;gt;() for the structures.&lt;/li&gt;&lt;li&gt;typedef void * InterfaceMap;&lt;/li&gt;&lt;li&gt;Look for [=]. We should be able to remove this marker.&lt;/li&gt;&lt;li&gt;Find a way to simplify crossnet_box / unbox struct boxing / unboxing&lt;/li&gt;
&lt;/ul&gt; &lt;br /&gt; &lt;br /&gt;&lt;b&gt;Done: (to be released with next change set - around end of September)&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;Implemented default Equals() on struct.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Implemented correct Equals() and GetHashCode() as well for objects as I misinterpreted the behavior. Added unit-tests to validate that.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Class deriving from an instantiated generic interface compiles (wrapper used typename but we were not in a template definition).&lt;/li&gt;&lt;li&gt;Class deriving from the same interface multiple times (like IEnumerable&amp;lt;int&amp;gt; and IEnumerable&amp;lt;double&amp;gt;) is now handled properly.&lt;/li&gt;&lt;li&gt;Found the correct order between GetEnumerator(), IEnumerator and IEnumerator() in foreach statement&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;Unit test completely enabled as issues fixed above are fixed.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Fixed case where explicit interface could be shadowed by implicit implementation of an interface method.&lt;/li&gt;&lt;li&gt;Strings with embedded '\0' are now initialized correctly.&lt;/li&gt;&lt;li&gt;Global namespace is now handled correctly.&lt;/li&gt;&lt;li&gt;Fixed issue with op&lt;i&gt;Explicit&lt;/i&gt;IntPtr from void *&lt;/li&gt;&lt;li&gt;Fixed implicit cast with generics; the generated function name was incorrect.&lt;/li&gt;&lt;li&gt;Array::TestArraysClass__TestRef now compiles correctly when the assembly is compiled in release.&lt;/li&gt;&lt;li&gt;Cleaned generation of arrays and template so &amp;quot;&amp;gt;&amp;gt;&amp;quot; is not generated in the incorrect places.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;(VC++ 2005 compiles correctly with two nested templates - !- but I don't think it's ANSI C++).&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Added unit-test to compare content / hashcode between boxed / unboxed type (primitive type, enums, user struct, generic user struct, strings).&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;IEquatable is part of the test as well... The test is done using a generic to test things even further.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;T[] implements correctly IList&amp;lt;T&amp;gt;, IList, ICollection, ICloneable. Unit-tests added (mostly covered). Still have IEnumerable and IEnumerable&amp;lt;&amp;gt; to finalize.&lt;/li&gt;&lt;li&gt;Finished to rename types with __ when they were encapsulated in the namespace CrossNetRuntime.&lt;/li&gt;&lt;li&gt;Added unit test for struct + interface call / Boxed object.&lt;/li&gt;&lt;li&gt;Improved unit-test for struct construction (regarding declaration / static field initialization / field initialization / inherited constructor).&lt;/li&gt;&lt;li&gt;Fixed typeof in generics, now one macro encapsulates correctly primitive types, structures and classes, with generics it was previously impossible to determine the correct macro.&lt;/li&gt;&lt;li&gt;Added CrossNetRuntime::Tracer::DoTrace() helper method to trace objects (very useful for generic members).&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;It uses traits, so that's resolved at compile time and is a no-op where there is no need to trace.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Handled static constructors and static members for generic types.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;For the concerned generics, static constructors are called at every construction (and a flag make sure that we call the init only one time).&lt;/li&gt;&lt;li&gt;The current implementation is limited, it &lt;i&gt;might&lt;/i&gt; create link errors if several assemblies using the generic with static constructors are compiled in different obj files. This can be improved later as needed.&lt;/li&gt;&lt;li&gt;Currently static members are traced when we are tracing each instance (that mean they can be traced several times). This will be optimized over time.&lt;/li&gt;&lt;li&gt;Accessing directly static members of a generic type may not return a correct result if a corresponding generic instance has not been created earlier (static constructor is called at instance creation).&lt;/li&gt;&lt;li&gt;Beside adding a check before each static member access I don't think there is an easy fix.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Anonymous methods are now supported!&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;There was more work than expected as I ended up having to generate what the C# compiler does. Pretty nice design though, very transparent for the user. Lot of work for the compiler ;)&lt;/li&gt;&lt;li&gt;Expect some issues if the declaring type is generic as I didn't test that yet. Should be easy to fix though.&lt;/li&gt;
&lt;/ul&gt;&lt;li&gt;Re-enabled Mono's unit tests.&lt;/li&gt;&lt;ul&gt;
&lt;li&gt;55 unit tests have been disabled on around 230 unit-tests. The reason is because the features are not supported yet: &lt;/li&gt;&lt;li&gt;Unit-tests using things like: Reflection, Multi-threading, exception on divide by zero, attributes, CodeGen, StructLayout, Asynchronous delegates, __arglist, DateTime implementation, support for nan.&lt;/li&gt;&lt;li&gt;All these features are already documented as not supported or in the to do list...&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;</description><author>OlivierNallet</author><pubDate>Mon, 24 Sep 2007 04:34:21 GMT</pubDate><guid isPermaLink="false">UPDATED WIKI: To do! 20070924043421A</guid></item></channel></rss>