确保通过指定的程序集调用程序集

时间:2010-05-17 21:06:01

标签: c# .net powershell assemblies

是否有内置功能来确定是否从特定程序集调用程序集?

我有汇编A,它引用了汇编B。程序集A公开了B中的PowerShell cmdlet和输出类型。某些类型为B公开的方法和属性对程序集A中的类型感兴趣,但PowerShell的使用者或任何试图直接在B中加载类型并且调用的人都不感兴趣其中的方法。

我已经研究过InternalsVisibleToAttribute,但由于使用了接口,因此需要进行大量的返工。我正在设计一个共享密钥系统,以后会被混淆,但看起来很笨重。

有没有办法确保B仅调用A

2 个答案:

答案 0 :(得分:4)

您可以在程序集上使用强名称键来执行此操作。

首先确保调用程序集(程序集A)是强名称签名(这可以在签名选项卡下的项目属性屏幕中完成)

以下代码将从调用程序集中检索强名称密钥。

internal static StrongName GetStrongName(Evidence evidence)
{
    foreach (var e in evidence)
    {
        if (e is StrongName)
        {
            return (StrongName)e;
        }
    }
    throw new ArgumentException();
}

最简单的方法是使用相同的StrongName对两个程序集进行签名,然后验证Assembly.GetCallingAssembly()。证据和Assembly.GetExecutingAssembly()。证据由相同的StrongName签名。

var callerKey = GetStrongName(Assembly.GetCallingAssembly().Evidence).PublicKey;
var execKey = GetStrongName(Assembly.GetExecutingAssembly().Evidence).PublicKey;

if (callerKey != execKey)
{
    throw new UnauthorizedAccessException("The strong name of the calling assembly is invalid.");
}

在现有代码库上实现这可能是不切实际的,但是看看LinFu AOP,您应该能够实现一个属性,该属性可以附加到需要为有效调用者检查的类。< / p>

答案 1 :(得分:2)

我认为InternalsVisibleToAttribute是最佳选择。检查Assembly.GetCallingAssembly

的另一个选项