zoukankan      html  css  js  c++  java
  • .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啦。

  • 相关阅读:
    蛙蛙请教:问几个面向对象设计的问题
    推荐一些flash和asp.net结合开发的文章
    写一个跟踪的类库
    蛙蛙推荐:有关随机数的一些讨论
    蛙蛙推荐:用ASP.NET WEB Services和Flash MX 2004打造MP3播放器
    HiveQL学习
    Linux rpm 命令参数使用详解[介绍和应用]
    java.util.concurrent.locks.Condition 例子程序探讨
    [转]sudoers设置
    配置linux电脑
  • 原文地址:https://www.cnblogs.com/icbcfang/p/4384359.html
Copyright © 2011-2022 走看看