我可以通过不同的“API”DLL 只公开一个 .NET DLL 的公共类的一部分吗?

Posted

技术标签:

【中文标题】我可以通过不同的“API”DLL 只公开一个 .NET DLL 的公共类的一部分吗?【英文标题】:Can I expose only a portion of one .NET DLL's public classes via a different "API" DLL? 【发布时间】:2011-02-15 08:28:33 【问题描述】:

我正在设计一个 WPF 应用程序,该应用程序使用一个可能包含 40 个公共类的 DLL。出于多种原因,包括易于数据绑定和混淆,我需要将这些公开。我希望允许其他人仅将这些类的一部分用作我的软件的 API。

我想我会创建一个主库 (core.dll) 和一个 API 库 (coreAPI.dll),其中包含要在新项目中引用的 API DLL。有没有办法让 coreAPI.dll 只公开 core.dll 中存在的几个类?这不是一个安全问题,因为我主要想从 Visual Studio Intellisense 中隐藏一些不需要的类。

同样,我想隐藏的内部类并不是一个真正的选择,因为我需要在 WPF 中对其中一些类进行数据绑定,为此,它们必须是公共的。有没有其他方法可以做到这一点?

【问题讨论】:

我不知道它是否适用于绑定,但你看过 InternalsVisibleTo msdn.microsoft.com/en-us/library/… 是的,我一开始尝试过,但事实证明,使用 InternalsVisibleTo,混淆几乎是不可能的,而且它也不适用于数据绑定。 【参考方案1】:

正如 Damien 已经提到的,如果您只想隐藏 Intellisense,您可以将以下属性添加到您的 hidden 类中:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

【讨论】:

【参考方案2】:

如果主要问题是 Intellisense,那么将这些类移到单独的命名空间中肯定可以解决问题吗?

当然,您可以将类拆分为两个单独的程序集。您可能会遇到一些问题,必须公开比您想要的更多的类(因为它们现在位于单独的程序集中),这可能可以使用 InternalsVisibleTo 属性解决

【讨论】:

我想保持我的命名空间与 dll 名称相同,但我可能会听取您的建议。理想情况下,我还希望公开的类属性在 Intellisense 中显示为只读。

以上是关于我可以通过不同的“API”DLL 只公开一个 .NET DLL 的公共类的一部分吗?的主要内容,如果未能解决你的问题,请参考以下文章

C DLL 和 Python CTypes - 发布/调试中的不同返回

多个端点以公开同一资源的不同视图

从 C++ dll 导出一个类?

C#如何在DLL中公开事件

如何向 Internet 公开 Web API 以授予与同一网络上的不同计算机连接的能力

监控 API 调用 [重复]