Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NET1.1条件编译_C#_.net 1.1_Conditional Compilation - Fatal编程技术网

C# NET1.1条件编译

C# NET1.1条件编译,c#,.net-1.1,conditional-compilation,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 我缺少的是编译器符

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

我有一个加密库,将用于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能够进入新的框架


谢谢

您的代码已经实现了您想要的功能-如果没有定义“NET1.1”符号,它将使用第二段代码

是的,你必须为1.1和2.0分别编译,这样才能工作,因为你会得到不同的结果——一个只会得到第一个重载;一个只会以第二个过载结束

您可能可以在2.0或更高版本中运行1.1代码-这是正常情况-但是由于您不能有一个包含该方法的两个版本并且与1.1兼容的单一版本,因此您最好使用两个版本

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

public void LoadKeys(X509Certificate cert)
{
....
}
#if !NET1.1
public void LoadKeys(X509Certificate2 cert)
{
....
}
#endif
编辑:仅澄清与Artur在评论中讨论的几点:

  • Artur关于不能在.NET4应用程序中使用.NET1.1的笼统声明是绝对错误的。我刚刚用NUnit的.NET1.1版本完成了这项工作(这是我手头上最简单的.NET1.1库)
  • 如果您依赖于代码访问安全性,那么框架版本之间会发生变化;你必须查看你正在做的事情的细节,看看这些差异是否显著
  • 由于二进制格式的更改,您无法构建.NET2程序集并在.NET1.1中运行它-只有相反的方法才能工作
  • 虽然您可能依赖于.NET 1.1中的调用,该调用已从.NET的更高版本中删除,但这是一种非常罕见的情况,应该很容易确定。总的来说,微软试图很好地保持向后兼容性
您可能还想阅读


最后,我要指出的是.NET 1.1现在真的很老了-如果你知道你需要支持它,那就足够公平了,但就我个人而言,如果可能的话,我会尝试让客户端升级:)

它工作了:)但是,我必须为每个fw定义一个构建,这需要时间,我不知道;我没有我想要的那么多。@Kat:真的吗?您需要在其他不同的框架版本之间有什么区别?如果你想利用更多的东西,你需要用一个单独的版本来覆盖它——但是如果你对.NET2.0中的内容感到满意,那么你只需要1.1版本和2.0版本。@Jon Skeet:你大错特错了。虽然可以在2.0 FW中使用1.1的代码,.NET 1.1与.NET 4.0不兼容,只是因为文件格式存在差异,例如,.NET 4.0中本机生成的程序集包含一些元数据信息,无法剥离,但是对于.NET 1.1来说,这是不正确的,元数据信息可以从生成的exe中剥离出来,这会破坏程序集的安全性。@Artur:听起来你在谈论向前兼容性。我从来没有声称这会起作用-我是说1.1程序集可以在.NET2和更高版本中使用。谢谢大家的回答。我之所以使用NET1.1,是因为我有一个大型应用程序,我正在构建的库需要同时适用于这个应用程序和NET2及以上版本中已有的其他应用程序。在NET2.0应用程序中使用NET1.1 DLL确实有效(可能有些东西不喜欢CAS,但到目前为止还没有找到)。请提供比“它不起作用”更详细的信息。只有在使用不兼容的代码功能子集(包括API、委托、,匿名委托、匿名结构、郁金香、泛型、e.t.c(在.NET FW 4.0中很受欢迎)您无法使用新的语言功能(如旧编译器上的匿名结构)编译源代码关于我的“是的,它不工作”,一点也不相关:)