.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,那么特性不会执行,因为它不是对应用程序非常重要的东西。

时间:原作者:0个回答

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,所以它不是巨大的。

原作者:
...