Page 1 of 1

Installing Cobra svn3087 on .NET 4.0

PostPosted: Fri Dec 27, 2013 4:38 pm
by thriwkin
Since years, occasionally, I am using the "install-from-workspace.bat" to install Cobra from the SVN repository, and it always worked very well (when the "gacutil.exe" was in the PATH).
But now, when installing Cobra svn3087, I had some trouble,
because I have .NET 4.0 installed, and not .NET 4.5 (which cannot be installed on Windows XP).


Issue

Under this condition
- Windows XP SP3
- .NET Framework v4.0.30319
- current dir: "\Source" in SVN working copy of Revision 3087
- "gacutil.exe" in PATH
calling "bin\install-from-workspace.bat" gives this output:

Code: Select all
Compiling installation program...

Unhandled Exception: System.MissingMethodException: Method not found: 'Int32 System.Environment.get_CurrentManagedThreadId()'.
   at Cobra.Core_ert_b2a27b97480f2efb38f55a0042ba2a48.Extend_IEnumerable__T__ExtendIEnumerable.<Numbered>d__12`1..ctor(Int32 <>1__state)
   at Compiler._compile1(CompileParams params) in c:\Users\Administrator\Dropbox\Projects\Cobra\workspace-misc\Source\Compiler.cobra:line 394
   at Compiler.Compile(CompileParams params) in c:\Users\Administrator\Dropbox\Projects\Cobra\workspace-misc\Source\Compiler.cobra:line 387
   at CommandLine.DoCompile(List`1 paths, Boolean willPrintSuccessMsg, Boolean writeTestInvocation, Predicate`1 stopCompilation) in c:\Users\Administrator\Dropbox\Projects\Cobra\workspace-misc\Source\CommandLine.cobra:line 747
   at CommandLine.DoRun(List`1 paths) in c:\Users\Administrator\Dropbox\Projects\Cobra\workspace-misc\Source\CommandLine.cobra:line 888
   at CommandLine.Run(List`1 args) in c:\Users\Administrator\Dropbox\Projects\Cobra\workspace-misc\Source\CommandLine.cobra:line 712
   at CommandLine.Run() in c:\Users\Administrator\Dropbox\Projects\Cobra\workspace-misc\Source\CommandLine.cobra:line 648
   at CobraMain.Main() in c:\Users\Administrator\Dropbox\Projects\Cobra\workspace-misc\Source\cobra.cobra:line 26



Workaround

Copy
- "Snapshot\cobra.exe" of svn3079
onto
- "Snapshot\cobra.exe" of svn3087

Now calling
- "bin\install-from-workspace.bat"
gives this output:

Code: Select all
Compiling installation program...
 ...
Success!



But why? Not important, but the following text is about the reason.
------------------------------------------------------------------------------

Analysis

Presumably the "Snapshot\cobra.exe" of svn3079 was built with
- (M4) "mscorlib.dll" of "Mono\...\lib\mono\4.0", or
- (N4) "mscorlib.dll" of .NET Framework 4.0
and the "Snapshot\cobra.exe" of svn3087 (and svn3080, ...) was built with
- (M45) "mscorlib.dll" of "Mono\...\lib\mono\4.5", or
- (N45) "mscorlib.dll" of .NET Framework 4.5

If this code (in file "Source\Cobra.Core\ExtendIEnumerable.cobra")
extend IEnumerable<of T>
def numbered as KeyValuePair<of int, T>*
i = 0
for item in this
yield KeyValuePair<of int, T>(i, item)
i += 1

is compiled under M45/N45 then the output assembly contains a call to the property
- System.Environment.get_CurrentManagedThreadId()
which is not defined in M4/N4.
Hence, running the "Snapshot\cobra.exe" of svn3087 under M4/N4,
throws this Exception:
"System.MissingMethodException: Method not found:
'Int32 System.Environment.get_CurrentManagedThreadId()'."



Disassembling

How this Cobra code is translated via the C# compiler can be seen by disassembling "Snapshot\cobra.exe" of svn3087 (e.g. with ".NET Reflector"). This gives the following C#-like code -- the arrows (<===(n)===) are added. (Hard to read, because the C# compiler uses identifiers like "<Foo>" or "<>__foo", when it generates code for Iterators.)
Code: Select all
public class Extend_IEnumerable__T__ExtendIEnumerable {
   // ...
    [NotNull]
    public static IEnumerable<KeyValuePair<int, T>>
    Numbered<T>([NotNull] IEnumerable<T> _lh_this) {
       <Numbered>d__12<T> d__ = new <Numbered>d__12<T>(-2);   // <===(1)===
       d__.<>3___lh_this = _lh_this;
       return d__;
    }
// ===(1)===>
    public <Numbered>d__12(int <>1__state)   {
        this.<>1__state = <>1__state;
        this.<>l__initialThreadId = Environment.CurrentManagedThreadId;   // <===(2)===
    }
    // ...
}


Disassembling the "Snapshot\cobra.exe" of svn3079 shows that it does not contain a call to this property:
Code: Select all
public class Extend_IEnumerable__T__ExtendIEnumerable {
    //...
    [DebuggerHidden, NotNull]
    public static IEnumerable<KeyValuePair<int, T>>
    Numbered<T>([NotNull] IEnumerable<T> _lh_this) {
        <Numbered>c__Iterator5<T> iterator = new <Numbered>c__Iterator5<T>();  //<===(1)===
        iterator._lh_this = _lh_this;
        iterator.$PC = -2;
        return iterator;
    //...
//===(1)===>
    public <Numbered>c__Iterator5() {
                                                           // <===(2)===
    }
    //...
}

Re: Installing Cobra svn3087

PostPosted: Fri Dec 27, 2013 11:02 pm
by Charles
This is interesting:
http://marcgravell.blogspot.com/2012/09 ... d-net.html

Have no idea why they decided to change what method they use. Or why .NET 4.5 overlays .NET 4.0.

I really need to know if you have this problem with the Cobra 0.9.6 download or not. Can you try that?

Re: Installing Cobra svn3087

PostPosted: Sat Dec 28, 2013 2:17 am
by thriwkin
Charles wrote:I really need to know if you have this problem with the Cobra 0.9.6 download or not. Can you try that?

All-clear!
I tried out the Cobra 0.9.6 download:
- the "Snapshot\cobra.exe" of the Cobra-0.9.6.zip
is identical to
- the "Snapshot\cobra.exe" of the SVN revision 3079.
(Compared with "fc.exe": no differences. )

The installation was done in less than a minute.
I followed the instructions in the "ReadMe.text": ... "Success!".

Re: Installing Cobra svn3087 on .NET 4.0

PostPosted: Tue Dec 31, 2013 7:58 pm
by Charles
Yeah, .NET 4.5 has crept onto my main system as I'm sure it has on many others. Here are the recent release dates of .NET:

4.0 - 2010-04-12
4.5 - 2012-08-15
4.5.1 - 2013-10-17

We could shoot for supporting 4.0 for one more Cobra release. Or we could bump the requirement to 4.5, leaving Cobra 0.9.6 as the last version to support 4.0.

Thoughts? Feelings?

Re: Installing Cobra svn3087 on .NET 4.0

PostPosted: Wed Jan 01, 2014 6:02 pm
by nerdzero
I think the only version of Windows that doesn't support 4.5 is XP which hits end-of-life in April I believe and starting with Windows 8 it's bundled in the OS. The latest versions of Mono also support most of the features introduced in 4.5 so I'm all for bumping the requirement.