.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 }
View Code

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 }
View Code
 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 }
View Code

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 }
View Code

 注意:需要将SampleObject35放在SampleInvoke2的lib目录下

以上情况只是针对对原因旧系统的一些改造,如果是新系统,就没有必要用2.0啦。

原文地址:https://www.cnblogs.com/icbcfang/p/4384359.html