情况:
我正在创建 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/