NET1.1条件编译

时间:2011-09-23 00:28:42

标签: c# .net-1.1 conditional-compilation

我希望这是一个很容易解决的问题。

我有一个加密库,将用于NET1.1应用程序及更高版本。 X509Certificate类在NET1.1中,X509Certificate2在NET2.0及更高版本中。

我想做类似的事情:

#if NET1.1
public void LoadKeys(X509Certificate cert)
{
....
}
#else
public void LoadKeys(X509Certificate2 cert)
{
....
}
#endif

我缺少的是编译符号!

我发现NET20,NET30和NET40存在。但是我想做“如果NET1.1,那么这样做;否则,请使用高级模型”。

另外,奖金问题:),我是否必须分别在NET1.1和NET2.0中编译才能按预期工作?

或者我可以在NET1.1中编译DLL然后放入只有NET2.0的机器,希望ILM会转到新的框架吗?

由于

1 个答案:

答案 0 :(得分:1)

你的代码已经做了你想要的 - 如果没有定义“NET1.1”符号,它将使用第二段代码。

是的,你必须为1.1和2.0单独编译才能使用,因为你最终会得到不同的结果 - 最终只有第一次重载;一个人最终只会遇到第二次超载。

您可能可以运行2.0及更高版本的1.1代码 - 这是正常情况 - 但是因为您不能拥有包含和方法的两个版本的单个版本em> 1.1兼容,你也可以使用两个版本。

一种选择是两种方法都出现在.NET 2+版本中,以保留最初针对要构建的1.1版本构建的应用程序的向后兼容性:

public void LoadKeys(X509Certificate cert)
{
....
}
#if !NET1.1
public void LoadKeys(X509Certificate2 cert)
{
....
}
#endif

编辑:只是为了澄清与Artur讨论中的几点意见:

  • Artur的一句话是,你不能在.NET 4应用程序中使用.NET 1.1,这绝对是错误的。我刚刚使用.NET 1.1构建的NUnit(这是我必须提交的最简单的.NET 1.1库)
  • 如果您依赖代码访问安全性,那么已经在框架版本之间进行了更改;你必须看看你正在做什么的细节,看看差异是否显着
  • 无法构建一个.NET 2程序集,并且由于二进制格式的改变而在.NET 1.1中运行它 - 它只是相反的方式。
  • 虽然可能你依赖.NET 1.1中的调用已经从.NET的更高版本中删除了,但这是一个非常罕见的情况,并且应该相当容易确定。总的来说,微软试图很好地保持向后兼容性。

您可能还想阅读.NET 4 Migration Guide

最后,我要指出.NET 1.1现在真的旧 - 如果你知道你需要支持它,那那就足够了,但我个人试图让客户来如果可能的话升级:)