.net低版本调用高版本
前段时间在做项目转换时(以前是2008中创建,现在转成2010),遇到一个问题。下面简单叙述:
项目A(目标框架是3.5,里面用WPF创建了一些窗体)
项目B(目标框架是2.0,调用了项目A中的类)
在VS2008中,在项目B中添加项目A的引用时,没有问题,可以添加成功。但转成VS2010后,项目B就不能添加项目A的引用,添加时会报错,大概意思是.net
版本太高,原以为是2.0不能调用3.5,后来自己做实验,发觉是可以调用的。但如果这个3.5项目中添加了一些不属于2.0的技术,那就会出现上述的问题。
当时想到的解决方法是将项目B的目标框架改成3.5,但因为这个软件开发得很早,很多项目的目标框架都是2.0,项目B又是一个基础的组件,被很多其它
项目引用,若改项目B,那很多项目都要改(考虑安全因素,尽量不要大动,)既然这条路行不通,那就改用反射,添加项目C,C中定义一些接口,A中实现
这些接口,B不直接调用A,而是调C(是不是很乱啊!)
创建三个项目
1 SampleObject35 目标框架3.5
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using SampleObject2;
6 namespace SampleObject35
7 {
8 public class SampleCalcute:ISampleCalcute
9 {
10 public void PrintSum(int a, int b)
11 {
12 var sum = a + b;
13 Console.WriteLine(sum);
14 }
15
16 }
17 }
2 SampleObject2 目标框架2.0
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 5 namespace SampleObject2 6 { 7 public interface ISampleCalcute 8 { 9 void PrintSum(int a, int b); 10 } 11 }
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using System.Reflection; 5 namespace SampleObject2 6 { 7 public class CalcuteInstance 8 { 9 public static ISampleCalcute GetSampleInstance() 10 { 11 string directory = AppDomain.CurrentDomain.BaseDirectory; 12 string filename = directory + "SampleObject35.dll"; 13 if (System.IO.File.Exists(filename)) 14 { 15 Assembly ass = Assembly.LoadFile(filename); 16 object obj = ass.CreateInstance("SampleObject35.SampleCalcute", true, BindingFlags.Public | BindingFlags.Instance, null, null, null, null); 17 if (obj is ISampleCalcute) 18 { 19 return (ISampleCalcute)obj; 20 } 21 } 22 return null; 23 } 24 } 25 }
3 SampleInvoke2 目标框架2.0
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 using SampleObject2; 5 namespace SampleInvoke2 6 { 7 public class Sample 8 { 9 10 public static void Main(string[] args) 11 { 12 ISampleCalcute sampleCalcute = CalcuteInstance.GetSampleInstance(); 13 sampleCalcute.PrintSum(2,3); 14 Console.ReadKey(); 15 16 } 17 } 18 }
注意:需要将SampleObject35放在SampleInvoke2的lib目录下
以上情况只是针对对原因旧系统的一些改造,如果是新系统,就没有必要用2.0啦。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。