.net - VB.Net 可以以使用. NET 4功能来定位. NET 3.5 ast?

  显示原文与译文双语对照的内容
127 2

我想使用. NET 4.0中的一些特性,但仍然在 Visual Studio 2010中目标. NET 3.5. 基本上我想要有一些东西:


if (.NET 4 installed) then


 execute. NET 4 feature



这是可选功能,如果系统安装了. NET 4.0,我就希望它运行。 如果系统只有. NET 3.5,那么特性不会执行,因为它不是对应用程序非常重要的东西。

时间: 原作者:

77 2

首先,你必须针对框架的3.5版本,但是让程序通过使用类似于 this 3.5 ( 从开始) 加载程序( 如何强制应用程序使用. NET 或者更高版本) 。? ) :


<?xml version="1.0" encoding="utf-8"?>


<configuration>


 <startup>


 <supportedRuntime version="v4.0"/>


 <supportedRuntime version="v2.0.50727"/>


 </startup>


</configuration>



如何激活 4.0功能,取决于要使用的功能。 如果它是一个构建的类上的方法,你可以查找它并在它存在时使用它。 下面是 C# ( 它同样适用于 VB ) 中的一个示例:


var textOptions = Type.GetType("System.Windows.Media.TextOptions," +


"PresentationFramework, Version=4.0.0.0," +


"Culture=neutral, PublicKeyToken=31bf3856ad364e35");


if (textOptions!= null)


{


 var setMode = textOptions.GetMethod("SetTextFormattingMode");


 if (setMode!= null)


//don't bother to lookup TextFormattingMode.Display -- we know it's 1


 setMode.Invoke(null, new object[] { this, 1 });


}



MainWindow 框架下,如果把这个设置为在. NET 框架下运行的应用程序,那么在 3.5下就不做任何事情。

如果要使用 3.5中不可用的类型,则必须为它的创建一个新程序集。 例如创建类库项目目标 4.0使用如下所示的代码调用"阶乘":


using System.Numerics;



namespace Factorial


{


 public class BigFactorial


 {


 public static object Factorial(int arg)


 {


 BigInteger accum = 1;//BigInteger is in 4.0 only


 while (arg> 0)


 accum *= arg--;


 return accum;


 }


 }


}



然后创建一个 targetting 3.5的项目,代码如下( 相同的C# 免责声明) 所示:


using System;


using System.Reflection;



namespace runtime


{


 class Program


 {


 static MethodInfo factorial;



 static Program()


 {//look for Factorial.dll


 try


 {


 factorial = Assembly.LoadFrom("Factorial.dll")


. GetType("Factorial.BigFactorial")


. GetMethod("Factorial");


 }


 catch


 {//ignore errors; we just won't get this feature


 }


 }



 static object Factorial(int arg)


 {


//if the feature is needed and available, use it


 if (arg> 20 && factorial!= null)


 return factorial.Invoke(null, new object[] { arg });


//default to regular behavior


 long accum = 1;


 while (arg> 0)


 accum = checked(accum * arg--);


 return accum;


 }



 static void Main(string[] args)


 {


 try


 {


 for (int i = 0; i <25; i++)


 Console.WriteLine(i +":" + Factorial(i));


 }


 catch (OverflowException)


 {


 if (Environment.Version.Major == 4)


 Console.WriteLine("Factorial function couldn't be found");


 else


 Console.WriteLine("You're running" + Environment.Version);


 }


 }


 }


}



在同一个目录中,将EXE和 Factorial.DLL 复制到同一个目录中,你将得到所有的前 25阶乘,并且只有 4.0个阶乘以及一个错误消息,在( 或者如果它找不到 DLL ) 。

原作者:
138 1

不可以只有一个限制选项是使用条件编译,如下所示:


#if NET40


 some 4.0 code 


#else


 some 3.5 code


#endif



但是它的限制是,它要么编译代码,也不能在运行时编译执行路径。 在文件的顶部或者项目属性生成选项卡中( 或者在编译项目时,可以在条件编译符号中声明条件编译符号。

最好的做法是确保安装了. NET 4.0框架- 它只是完整版本的49MB,所以它不是巨大的。

原作者:
...