外部提供有限的API作为DLL
本文关键字:作为 DLL API 提供有 外部 | 更新日期: 2023-09-27 17:58:43
如果您必须以DLL的形式对外公开功能,但只能公开功能的一个子集(这意味着您不能提供核心DLL,因为它会公开所有内容),最好如何做到这一点?
目前,我真的看不到任何不涉及在单独的DLL中重新创建核心库部分的方法。
您可以将internal
与友元程序集一起使用。您的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,只公开您想要公开的方法,每个方法或多或少都是核心中"Same"方法的"传递"?
因此,如果核心称为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();
}
}
在这里创建单独程序集的一个优点是,您可以将核心功能视为一个概念,而将其公开(向特定目的或受众)视为另一个概念。您可能很想在稍后阶段公开不同的功能,,但要向不同的受众公开-您现在需要两个不同的公共API:因此,任何关于核心程序集中"公共"的概念现在都可能模糊不清。
我认为这取决于隐藏核心库的目的。
如果你不想让你的客户调用代码,例如,如果这可能会破坏你库的使用场景,或者可能导致不希望的行为,或者为了阻止调用代码,你可以将受保护的类设置为内部类,并使用InternalsVisibleToAttribute来包括Facade程序集。如果我仍然需要核心类在我的应用程序中可见,我甚至会再使用一个构建配置:
#if PUBLIC_BUILD
internal
#else
public
#endif
class ProtectedCoreClass
当然,如果您有太多的类,那么应该准备一些脚本来更改现有的类,并且应该修改VisualStudio的新类模板。
但另一种情况是,如果你想防止源代码被你的客户监视,以隐藏一些超级独特的算法或其他什么。然后你应该研究一些代码混淆器。但绝对没有办法100%保证代码不会被反编译和分析。这只是关于饼干商或竞争对手为此付出的价格
但是,如果隐藏源代码仍然非常重要,那么您可能只需要将代码托管在服务器上(以确保代码在物理上不可访问)或云中,并提供WCF或您的公开程序集将调用的web服务。