在c#中,如何限制谁可以在编译时调用一个方法

本文关键字:调用 方法 一个 何限制 编译 | 更新日期: 2023-09-27 18:14:26

在c#中,是否有可能限制谁可以在编译时调用方法?

我已经研究过指令,但那没有用,因为我不能给符号赋值。

#define WHO VisualStudioUser.Current // does not work

我还研究了代码访问安全(CAS),但这是运行时强制执行,而不是编译时。

要求限制特定开发人员在编译时访问某个方法,如果该方法存在于预编译的程序集中。

这里有更多的细节…我正在为一个开发团队构建一个框架或系列或程序集。由于我们的软件许可限制,我只能允许少数开发人员编写代码来调用一些受限制的方法。开发人员将无法访问框架的源代码,但他们可以访问已编译的框架程序集。

在c#中,如何限制谁可以在编译时调用一个方法

快速的回答将是:不,这是不可能的,如果你需要这样做,你做错了。

这怎么可能呢?这取决于谁在运行代码还是谁写的代码?

Edit有一种方法使用InternalsVisibleTo并限制在源代码控制中对InternalsVisibleTo指定的程序集的访问。参见jord的回答

要求限制特定开发人员在编译时访问某个方法,如果该方法存在于预编译的程序集中。

一种方法是将方法标记为privateinternal,它不会被任何人在程序集之外调用。UPDATE:还要看一下InternalsVisibleTo属性,它用于定义哪些程序集可以"看到"程序集的内部。

另一种方法是将您想要分发的代码与不希望人们调用的代码划分为单独的程序集。也许你只是和你的用户共享一个主要由接口组成的程序集,他们根据这个程序进行编译;你有一个独立的程序集,它们不应该直接引用它的实现。您的内部团队可以访问实现程序集。这只是依赖管理的一种常见形式,依赖倒置原则。

草稿:

  1. 将受限制的代码编译成(混淆的)dll: TypeA.dll, TypeB.dll等
  2. 为每种类型定义一个接口,并将它们编译成单独的dll: ITypeA.dll, ITypeB.dll等
  3. 创建一个"保护程序集",并将所有受限制的程序集嵌入其中:guard .dll它有一个ResolveEventHandler,以及实例化在嵌入式受限dll中定义的不同类型的方法。实例通过接口返回。开发人员获得接口dll和Guard.dll。每个开发人员都可以获得一个Guard.dll,其中包含特殊的身份验证令牌。例如,Guard.dll可以绑定到PC, IP地址,发给开发者的GUID,任何东西。
  4. 开发人员可以实例化那些她有适当认证码的类型,并通过接口使用对象实例。

对不起,这有点模糊,因为这是一年多前我使用这些技术的时候。我希望你讲清楚了主旨。

你可以尝试使用可扩展c#开发的ResolveCorp,一些链接的研究和实现:

http://zef.me/782/extensible-c

http://www.codeproject.com/KB/architecture/DbCwithXCSharp.aspx

http://weblogs.asp.net/nunitaddin/archive/2003/02/14/2412.aspx

http://www.devx.com/dotnet/Article/11579/0/page/5