以前的程序和DLL都是在1.1的环境下做成的,后来DLL更新了并在2.0的环境下编译生成
发现只替换DLL程序运行会出错 只能把原来的程序再次在2.0的环境下编译才行微软有没有相关的说明?多谢

解决方案 »

  1.   

    1.x版本的exe只能加载1.x版的dll,因为2.0的dll格式变了,1.x的exe不能正确识别。
      

  2.   

    多谢几位的回答To:ice_frank ()
    如果能有相关说明的网站 能否告知To:lextm ()
    什么叫格式变了 能否有官方的说明网址?
      

  3.   

    官方没有具体的说明,因为一般程序员开发不可能用到。主要的区别在于2.0的CLR支持泛型,因此MSIL有了变化,所以编译出的DLL带有一个2.0的说明标记。.NET 1.x的exe依然采用1.x的方式访问这个dll,自然会认为这个dll无效。具体的文件头,可以用SDK中的工具Ildasm.exe或者corflags.exe提取。
      

  4.   

    NET1.1版的程序 可以 调用.NET2.0编译的DLL的问题。
    方法有很多,其中一种是用System.Reflection 。 MSDN:using System;
    using System.Reflection;
    using System.Security.Permissions;[assembly:AssemblyVersionAttribute("1.0.2000.0")]public class Example
    {
        private int factor;
        public Example(int f)
        {
            factor = f;
        }    public int SampleMethod(int x) 
        { 
            Console.WriteLine("\nExample.SampleMethod({0}) executes.", x);
            return x * factor;
        }    public static void Main()
        {
            Assembly assem = Assembly.GetExecutingAssembly();        Console.WriteLine("Assembly Full Name:");
            Console.WriteLine(assem.FullName);        // The AssemblyName type can be used to parse the full name.
            AssemblyName assemName = assem.GetName();
            Console.WriteLine("\nName: {0}", assemName.Name);
            Console.WriteLine("Version: {0}.{1}", 
                assemName.Version.Major, assemName.Version.Minor);        Console.WriteLine("\nAssembly CodeBase:");
            Console.WriteLine(assem.CodeBase);        // Create an object from the assembly, passing in the correct number
            // and type of arguments for the constructor.
            Object o = assem.CreateInstance("Example", false, 
                BindingFlags.ExactBinding, 
                null, new Object[] { 2 }, null, null);        // Make a late-bound call to an instance method of the object.    
            MethodInfo m = assem.GetType("Example").GetMethod("SampleMethod");
            Object ret = m.Invoke(o, new Object[] { 42 });
            Console.WriteLine("SampleMethod returned {0}.", ret);        Console.WriteLine("\nAssembly entry point:");
            Console.WriteLine(assem.EntryPoint);
        }
    }/* This code example produces output similar to the following:Assembly Full Name:
    source, Version=1.0.2000.0, Culture=neutral, PublicKeyToken=nullName: source
    Version: 1.0Assembly CodeBase:
    file:///C:/sdtree/AssemblyClass/cs/source.exeExample.SampleMethod(42) executes.
    SampleMethod returned 84.Assembly entry point:
    Void Main()
     */
      

  5.   

    2.0编译的dll肯定不能在1.1下面使用,区别还很多的,兼容有问题。
      

  6.   

    使用反射也需要严格的条件,那就是1.x编写和编译的exe必须运行在2.0的CLR上面,这样才能反射加载2.0编写和编译的dll。如果都是在1.x的CLR上面运行,还是会出错。