.NET1.1版的程序调用.NET2.0编译的DLL的问题

whq1982 2008-03-21 11:44:27
以前的程序和DLL都是在1.1的环境下做成的,后来DLL更新了并在2.0的环境下编译生成
发现只替换DLL程序运行会出错 只能把原来的程序再次在2.0的环境下编译才行

微软有没有相关的说明?多谢
...全文
174 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lextm 2008-03-22
  • 打赏
  • 举报
回复
使用反射也需要严格的条件,那就是1.x编写和编译的exe必须运行在2.0的CLR上面,这样才能反射加载2.0编写和编译的dll。如果都是在1.x的CLR上面运行,还是会出错。
春天的气息 2008-03-21
  • 打赏
  • 举报
回复
2.0编译的dll肯定不能在1.1下面使用,区别还很多的,兼容有问题。
chenyun122 2008-03-21
  • 打赏
  • 举报
回复
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=null

Name: source
Version: 1.0

Assembly CodeBase:
file:///C:/sdtree/AssemblyClass/cs/source.exe

Example.SampleMethod(42) executes.
SampleMethod returned 84.

Assembly entry point:
Void Main()
*/
officepoly 2008-03-21
  • 打赏
  • 举报
回复
太深了,看不懂~
Smart 2008-03-21
  • 打赏
  • 举报
回复
1.1和2.0的命名空间已经有了很大的区别,2.0中对很多命名空间做了重新分类,所以1.0和2.0可以说根本是不兼容的
lextm 2008-03-21
  • 打赏
  • 举报
回复
官方没有具体的说明,因为一般程序员开发不可能用到。主要的区别在于2.0的CLR支持泛型,因此MSIL有了变化,所以编译出的DLL带有一个2.0的说明标记。.NET 1.x的exe依然采用1.x的方式访问这个dll,自然会认为这个dll无效。

具体的文件头,可以用SDK中的工具Ildasm.exe或者corflags.exe提取。
whq1982 2008-03-21
  • 打赏
  • 举报
回复
多谢几位的回答

To:ice_frank ()
如果能有相关说明的网站 能否告知

To:lextm ()
什么叫格式变了 能否有官方的说明网址?
lextm 2008-03-21
  • 打赏
  • 举报
回复
1.x版本的exe只能加载1.x版的dll,因为2.0的dll格式变了,1.x的exe不能正确识别。
ice_frank 2008-03-21
  • 打赏
  • 举报
回复
因为使用的CLR是不同的
qiyousyc 2008-03-21
  • 打赏
  • 举报
回复
好像没有相关的说明。但肯定要重新编译程序的。
whq1982 2008-03-21
  • 打赏
  • 举报
回复
没人知道吗、顶一下

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧