我有一个需要在Compact .NET Framework 3.5和.NET Framework 3.5中编译的项目(事实上只有2个项目,只是编译两者之间发生变化的选项)。
问题是,CF .NET中缺少某些类,因此我手动创建了它(并实现了.NET中所有类的所有成员
一个例子:FtpWebRequest / FtpWebResponse类。
写这样的东西是不好的(如果是,为什么?):
#if CFNET35 // Only if we are in Compact Framework 3.5 mode
namespace System.Net
{
public class FtpWebRequest : WebRequest
{
// ...
}
public class FtpWebResponse : WebResponse
{
// ...
}
}
#endif
我确信在CF.NET35中这些方法永远不可用,所以我可以写它吗?
我会写这个是为了避免在项目中使用my库时发生名称冲突。
它允许我在其他项目中始终using System.Net;
whitout问我使用哪个框架......
谢谢!
几个月后,我会评估我使用的策略。
如上所述,我通过进行条件编译来覆盖System(.Net)命名空间,所以我有两个DLL(一个用于CF.NET,一个用于.NET)
这也包括我使用此DLL的所有应用程序都是双重的(每次都是CF.NET应用程序和一个包含相应库的.NET应用程序)。
所以,这是一个坏主意,我有很多项目是双重的,而且.NET应用程序可以直接包含和使用CF.NET库的方式是不必要的。
此外,我还没有注意的是,如果一个.NET应用程序包含一个带有覆盖系统名称空间的CF.NET库,那么它的初始化将因类名冲突而失败...
所以, EPIC FAIL ,提供通用界面是管理此案例的最佳方式。
答案 0 :(得分:6)
我可能会避免使用System
命名空间来编写自定义代码。我见过尝试这样做的开源库,它通常会导致头疼。
您可能最好创建一个在完整框架和紧凑框架之间共享的接口,然后在完整和CF中实现接口,使用内置的System类或您自己编写的类来提供所需的功能。 / p>
这看起来有点矫枉过正,但如果System.Net中的某些内容发生变化,您将来会更安全。您的调用代码应该只引用该接口,您可以根据您所在的平台插入任一实现。
// Shared interface
public interface IFtpUtil
{
SomeFileObject GetFile(SomeArgument a);
void PutFile(SomeFileObject f, SomeArgument a);
}
// Full framework implementation
public class FullFtpUtil : IFtpUtil
{
public ... GetFile(...)
{
// Use System.Net classes from full framework
}
public ... PutFile(...)
{
// Use System.Net classes from full framework
}
}
// Compact framework implementation
public class CompactFtpUtil : IFtpUtil
{
public ... GetFile(...)
{
// Use your own FTP classes
}
public ... PutFile(...)
{
// Use your own FTP classes
}
}
答案 1 :(得分:5)
我不会这样做;不是因为任何具体的技术原因,而是因为它可能会引起一些重大的混乱。 没有人希望自定义类驻留在System
命名空间中。
System
命名空间中的类已经过广泛测试并被许多人使用,因此,如果您团队中的其他人在其代码中使用System.Net.FtpWebRequest
并且他们的代码无效,他们会(并且应该首先在自己的代码中搜索错误。经过几个小时的搜索,当他们发现错误出现在显然内置的系统类中时,他们会生你的气。
答案 2 :(得分:1)
我意识到我对这个问题迟到了,但我认为我可以增加一些价值,因为我们做了很多。对于与桌面框架匹配的类,SDF可能是50%的填充。我们所做的是使用我们自己的命名空间。让我们以Ftp为例。我们这样做:
namespace OpenNETCF.Net
public class FtpWebRequest { ... }
消费者应用会使用别名来解决这个问题:
#if NETCF
using FtpWebRequest = OpenNETCF.Net.FtpWebRequest;
#else
using FtpWebRequest = System.Net.FtpWebRequest;
#endif
void Foo()
{
// the alias above resolves these for you
// enabling a single, fairly clean code base
var request = new FtpWebRequest(...);
}
答案 3 :(得分:0)
有类似的情况。想要在winforms框架中使用一些名称空间/类可用,但是,从移动框架中删除。
我建议不要将你的命名空间放在“系统”命名空间中,但我建议设计你的代码,尽可能与框架类似,除非你的应用程序。需要特定的附加功能。
using system;
// "sysmobile" emulates code for the "system" namespace
namespace sysmobile {
class FtpWebRequest { ... }
class FtpWebResponse { ... }
}