.NET version control system

I have the following assemblies in my solution:

  • The main assembly (not very named);
  • Class Library 1 (with a strong name with v.1.0.0.0);
  • Class Library 1 (with a strong name with v.2.0.0.0);
  • Class Library 2 (not very named).

These assemblies are connected to each other as shown below: Assemblies dependency scheme

"Main assembly" depends on "Class Library 1" (v.2.0.0.0) and "Class Library 2", "Class Library 2" depends on "Class Library 2" (v.1.0.0.0).

Class Library 1 code (both for v.1.0.0.0 and v.2.0.0.0):

namespace ClassLibrary1
{
    public class Class
    {
    }
}

Class Library 2:

namespace ClassLibrary2
{
    public class Class(ClassLibrary1.Class c)
    {
    }
}

Main assembly code:

namespace MainAssembly
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            ClassLibrary1.Class c1 = new ClassLibrary1.Class();
            ClassLibrary2.Class c2 = new ClassLibrary2.Class(c1);
        }
    }
}

This code compiles and runs without errors, despite the fact that the versions of the "Class Library 1" collectors do not match! Why?

, ClassLibrary2.Class Reflection ( ), runtime System.ArgumentException:

"ClassLibrary1.Class" "ClassLibrary1.Class".

namespace MainAssembly
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            ClassLibrary1.Class c1 = new ClassLibrary1.Class();
            typeof(ClassLibrary2.Class).GetConstructors()[0].Invoke(new[]{ c1 });
        }
    }
}

UPDATE

, . IL , , c1 , " 1" (v.2.0.0.0), ClassLibrary2.Class, 1 '(v.2.0.0.0).

.assembly extern ClassLibrary1
{
    .publickeytoken = (F3 A6 02 4F 9E A4 F3 DB )                         // ...O....
    .ver 2:0:0:0
}
.assembly extern ClassLibrary2
{
    .ver 1:0:0:0
}
.assembly extern ClassLibrary1 as ClassLibrary_3
{
    .publickeytoken = (F3 A6 02 4F 9E A4 F3 DB )                         // ...O....
    .ver 1:0:0:0
}

.class private auto ansi beforefieldinit MainAssembly.Program
   extends [mscorlib]System.Object
{
    .method private hidebysig static void  Main(string[] args) cil managed
    {
        .entrypoint
        // Code size       22 (0x16)
        .maxstack  1
         .locals init (
             [0] class [ClassLibrary1]ClassLibrary1.Class c1,
             [1] class [ClassLibrary2]ClassLibrary2.Class c2,
             [2] class MainAssembly.Class c3)
        IL_0000:  nop
        IL_0001:  newobj     instance void [ClassLibrary1]ClassLibrary.Class::.ctor()
        IL_0006:  stloc.0
        IL_0007:  ldloc.0
        IL_0008:  newobj     instance void [ClassLibrary2]ClassLibrary2.Class::.ctor(class [ClassLibrary_3]ClassLibrary.Class)
        IL_000d:  stloc.1
        IL_000e:  ldloc.0
        IL_000f:  newobj     instance void MainAssembly.Class::.ctor(class [ClassLibrary1]ClassLibrary.Class
        IL_0014:  stloc.2
        IL_0015:  ret
    } // end of method Program::Main
} // end of class Client.Program
+4

Source: https://habr.com/ru/post/1532002/


All Articles