c# - 对方法的不同级别的访问

标签 c# .net

情况:

我正在创建 2 个库:X1.dll 和 X2.dll。它们是单独创建和修改的,并且它们的项目无法合并为一个解决方案。

X1.dll 包含类 C1 的定义。 X2.dll 包含类 C2 的定义。

X2.dll 引用 X1.dll。

类 C1 有一个方法 M1()。该方法在 X2.dll 中使用,这就是 M1() 被设为公共(public)方法的原因。

我将 X1.dll 和 X2.dll 分发给其他开发人员。但我不希望他们调用 M1() - 他们可以对 C1 实例做任何他们想做的事情,但不要碰 M1()。同时,M1() 已经是公共(public)的,因为我必须能够在 X2.dll 中调用它。

问题:

组织 M1() 的最佳方式是什么,以便使其仅供我使用,但仍然不合并 X1.dll 和 X2.dll 的项目?

有很多尴尬的解决方案,例如将 M1() 作为 M1(string SecreteCode) 并对这个 SecreteCode 进行硬编码,因此我是唯一一个可以将其作为正确参数传递的人。

但是实现这一目标的最佳实践是什么?

感谢您的建议!

最佳答案

制作M1() 内部并添加InternalsVisibleToAttribute在您的程序集中允许 X2.dll 调用 X1.dll内部 代码。此解决方案使 X1 中的所有内部代码在 X2 中可见,但您确信没有其他人可见将调用 M1()

来自文档:

Ordinarily, types and members with internal scope (in C#) and friend scope (in Visual Basic) are visible only in the assembly in which they are defined. The InternalsVisibleToAttribute attribute makes them also visible to the types in a specified assembly, which is known as a friend assembly.

只需将[ assembly:InternalsVisibleTo("X2")] 添加到您的程序集中即可。如果您的程序集已签名,则需要添加强名称 key 的公钥,如下所示 [ assembly:InternalsVisibleTo("X2, PublicKey=0000000000")]

这比“ secret 代码”更好,因为 C# 代码很容易反编译,而且你的 secret 不会长期保密!

关于c# - 对方法的不同级别的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289700/

相关文章:

c# - XAML - 如何反转 UIElement.RenderTransform?

c# - 我想每秒显示数字时钟来刷新TextBox(Windows App)

c# - 关于外部库和命名空间的问题

c# - NCommon - 资源、文档

.net - 在另一个应用程序中调用公共(public)函数

c# - 将 vb.net asp.net 代码转换为 C#

c# System.Diagnostics.Process 不执行任何操作或抛出错误

c# - 配置等待和性能

c# - 私有(private)类变量的字段与属性

.net - 使用 iText 7 添加元数据