是否有内置功能来确定是否从特定程序集调用程序集?
我有汇编A
,它引用了汇编B
。程序集A
公开了B
中的PowerShell cmdlet和输出类型。某些类型为B
公开的方法和属性对程序集A
中的类型感兴趣,但PowerShell的使用者或任何试图直接在B
中加载类型并且调用的人都不感兴趣其中的方法。
我已经研究过InternalsVisibleToAttribute
,但由于使用了接口,因此需要进行大量的返工。我正在设计一个共享密钥系统,以后会被混淆,但看起来很笨重。
有没有办法确保B
仅调用A
?
答案 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