这是出于研究目的。 我安装了.Net framework 2.0,我想动态加载mscorlib.dll 1.1来执行其特定的内部函数。
当我用C#编写此代码时:
static void Main(string[] args)
{
Assembly assem = Assembly.LoadFrom("C:\\mscorlib_my_private_1.1.dll");
System.Type type = assem.GetType("System.Console");
Type[] typeArray =new Type[1];
typeArray.SetValue(typeof(string),0);
System.Reflection.MethodInfo info = type.GetMethod("WriteLine", typeArray);
object[] param = new object[1];
param[0] = assem.FullName;
type.InvokeMember("WriteLine",
System.Reflection.BindingFlags.InvokeMethod, System.Type.DefaultBinder,
"", param);
}
输出为“mscorlib,Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089” 不是预期的1.1版本。
经过Google搜索后,我知道mscorlib.dll非常特别,但是不可能吗?
答案 0 :(得分:2)
这是不可能的:mscorlib.dll依赖于为其编写的.NET运行时的内部。这些内部结构可能在.NET运行时的更高版本中发生了变化!
因此,即使您可以以某种方式欺骗.NET运行时加载错误的mscorlib.dll,您会发现某些方法有效,而其他方法会产生各种奇怪的错误(行为更改,绑定错误或访问冲突)。 / p>
答案 1 :(得分:1)
除了正在运行的.NET框架版本之外,您无法加载任何版本的mscorlib。如果您请求另一个,您将获得已加载的那个。这就是为什么mscorlib具有严格的向后兼容性。
答案 2 :(得分:0)
这让我觉得不可能。但是,你可以做的是针对你想要定位的每个.NET框架版本编译一个程序,然后从你的主应用程序运行这些程序。
答案 3 :(得分:0)
.NET 2.0不允许添加1.1版的mscorlib.dll引用。因此,要加载版本1.1的mscorlib,您可以执行一项操作,即编写预构建脚本以将此DLL复制到bin(或目标文件夹),这样您的代码就能够访问两个版本的mscorlib.dll。例如。复制$(Location of mscorlib.dll)\mscorlib.dll $(TargetDir)
会将此文件复制到项目的输出位置。