如果您必须将功能作为 DLL 从外部公开,但只是功能的子集(这意味着您不能提供核心 DLL,因为它会公开所有内容)如何最好地做到这一点?
目前,我真的看不到任何不涉及在单独的 DLL 中重新创建核心库部分的方法。
您可以internal
与 Friend Assemblies 一起使用。您的 API 可以成为允许访问内部成员的核心库的朋友。
有关更多详细信息,请参见此处 - http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.90).aspx
这将允许您保持核心对象内部化,同时允许 API 访问它们。
请注意,您仍然需要提供核心库。除非您使用某些东西来合并 .NET 程序集或将代码编译到您的 API 库中,否则没有办法解决这个问题。
但是我认为这是一个坏主意,您应该将这些实体分开。我不明白为什么这些天运送多个图书馆会出现问题。
仅供参考 - ILMerge 将让您合并 .NET 程序集,您可以从这里获取它 - http://research.microsoft.com/en-us/people/mbarnett/ilmerge.aspx
当然,只需创建一个包装核心 DLL 的新项目,只公开您想要公开的方法,每个方法或多或少地充当核心中“相同”方法的“传递”吗?
因此,如果您的核心被称为Core
:),它可能具有:
public int Foo()
{
//blah
}
public int Bar()
{
/blah
}
如果您只想公开Foo
,则创建一个引用的新项目,Core
如下所示:
using Core;
public class MyApi
{
private Core _coreInstance.... //some way of reaching Core, in other words
public int Foo()
{
return _coreInstance.Foo();
}
}
在这里创建一个单独的程序集的一个优点是,您将核心功能视为一个概念,并将其公开(针对特定目的或受众)作为另一个概念。您可能很想在稍后阶段公开“公开”不同的功能,但要向不同的受众公开 - 您现在需要 2 个不同的公开 API:因此,任何关于核心程序集中“公开”内容的概念现在都可能是模棱两可的。
我认为这取决于您隐藏核心库所遵循的目标。
如果您不想让您的客户调用代码,例如,如果这可能会破坏您的库的使用场景,或者可能导致不良行为,或者阻止调用代码的任何事情,您可以将受保护的类设为内部,并且使用 InternalsVisibleToAttribute 来包含 Facade 程序集。如果我仍然需要核心类在我的应用程序中可见,我什至会使用更多的构建配置:
#if PUBLIC_BUILD
internal
#else
public
#endif
class ProtectedCoreClass
但是当然如果你有太多的类,应该准备一些脚本来更改现有的类,并且应该修改 Visual Studio 的新类模板。
但是另一种情况是,如果您想防止源代码被客户监视,以隐藏一些超级独特的算法或其他东西。然后你应该研究一些代码混淆器。但是绝对没有办法 100% 保证代码不被反编译和分析。这只是关于破解者或竞争对手为此付出的代价。
但是,如果隐藏源代码仍然非常重要,您可能应该将代码托管在您的服务器上(以确保代码在物理上不可访问)或云中,并提供一个 WCF 或您的公开程序集将调用的 Web 服务。