[Mono-bugs] [Bug 643151] New: Assembly.ReflectionOnlyLoadFrom() can't load mscorlib.dll from a different runtime.

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Fri Oct 1 09:28:20 EDT 2010


https://bugzilla.novell.com/show_bug.cgi?id=643151

https://bugzilla.novell.com/show_bug.cgi?id=643151#c0


           Summary: Assembly.ReflectionOnlyLoadFrom() can't load
                    mscorlib.dll from a different runtime.
    Classification: Mono
           Product: Mono: Class Libraries
           Version: SVN
          Platform: x86-64
        OS/Version: openSUSE 11.3
            Status: NEW
          Severity: Enhancement
          Priority: P5 - None
         Component: CORLIB
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: jpryor at novell.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---
           Blocker: ---


User-Agent:       Mozilla/5.0 (X11; U; Linux x86_64; en-US) AppleWebKit/534.3
(KHTML, like Gecko) Chrome/6.0.472.63 Safari/534.3

Assembly.ReflectionOnlyLoadFrom() is unable to load an mscorlib.dll from a
different runtime version.  For example, consider the program:


  using System;
  using System.Reflection;

  class Test {
    public static void Main (string[] args)
    {
      foreach (string file in args) {
        try {
          var a = Assembly.ReflectionOnlyLoadFrom (file);
          Console.WriteLine ("File: {0}", file);
          Console.WriteLine ("\tFullName: {0}", a.FullName);
          Console.WriteLine ("\tLocation: {0}", a.Location);
        }
        catch (Exception e) {
          Console.WriteLine ("error: Could not load file '{0}': {1}",
            file, e.Message);
        }
      }
    }
  }

Run it:

$ mono load.exe /usr/lib/mono/1.0/mscorlib.dll /usr/lib/mono/2.0/mscorlib.dll
File: /usr/lib/mono/1.0/mscorlib.dll
    FullName: mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
    Location: /usr/lib/mono/2.0/mscorlib.dll
File: /usr/lib/mono/2.0/mscorlib.dll
    FullName: mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
    Location: /usr/lib/mono/2.0/mscorlib.dll

Notice that we always get the 2.0 version (because load.exe was build with
gmcs).  If we build the app with dmcs, we always get the 4.0 version.

Compare with .NET execution:

Z:\tmp>load.exe C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
File: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
        FullName: mscorlib, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77
a5c561934e089
        Location: C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll

Z:\tmp>load.exe C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
File: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll
        FullName: mscorlib, Version=2.0.0.0, Culture=neutral,
PublicKeyToken=b77
a5c561934e089
        Location: C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll

Notice that, when load.exe is built with a v4.0 compiler, we're able to load a
2.0 mscorlib.dll as well as a 4.0 assembly.

Alas, not all is roses in .NET land; if you build load.exe with a 2.0 compiler
and load a 4.0 mscorlib.dll:

Z:\tmp>load.exe C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorlib.dll
error: Could not load file
'C:\Windows\Microsoft.NET\Framework\v4.0.30319\mscorl
ib.dll': Could not load file or assembly
'file:///C:\Windows\Microsoft.NET\Frame
work\v4.0.30319\mscorlib.dll' or one of its dependencies. This assembly is
built
 by a runtime newer than the currently loaded runtime and cannot be loaded.

So, ideally Assembly.ReflectionOnlyLoadFrom() could load *any* mscorlib.dll
into *any* runtime (instead of always just returning the mscorlib.dll that's
already loaded into the process).  Failing that, it would be nice if we could
get .NET 4.0 behavior and be able to load previous runtime versions.

(Now, why care?  Mostly so that compiler writers can target different runtime
versions from what the compiler is executing on without needing to rewrite
large fractions of their compiler to use Mono.Cecil...) 

Reproducible: Always

Steps to Reproduce:
1.
2.
3.

-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.


More information about the mono-bugs mailing list