限制.DLL访问

本文关键字:访问 DLL 限制 | 更新日期: 2023-09-27 18:25:59

假设我有两个.dll,Dll1和Dll2。

DLL1使用或调用DLL2。

有没有一种方法可以确保是DLL1并且只有DLL1在调用DLL2?

更新1

这背后的原因是:

我有一个WinForms解决方案,为了简单起见,它包括一个视图项目和一个控制器项目(它生成一个单独的.dll)。在客户端机器上安装应用程序后,我意识到可以在它的"程序文件"文件夹中查看应用程序.dlls。有人可能会添加对控制器.dll的引用。我希望避免这种情况,这样就只有视图项目在进行调用。

更新2
我喜欢将控制器分离成一个单独的项目的原因之一是,我可能会有许多不同的视图项目调用并使用相同的控制器。然后,我只需要为所有视图维护一个控制器项目。例如,一个win表单应用程序和一个测试项目,甚至一个使用相同控制器项目的网站。但采用这种方法,我将面临我提到的安全问题(避免和控制对dll的不当使用)。

所以我有一种方法,通过使用不同的文件夹编译到一个.dll,我认为这是正确的,解决了我的安全问题,但它使我只能有一个视图。

另一方面,如果我有单独的项目,我会面临安全问题。

我仍然不确定我应该如何做,因为出于我提到的原因,我仍然想继续使用不同的项目。

更新3
关于使用StrongNameIdentityPermission权限要求,有什么建议吗
http://msdn.microsoft.com/en-us/library/ff648663.aspx(请参阅:限制哪些代码可以调用您的代码)
http://blogs.msmvps.com/manoj/2004/10/20/tip-strongnameidentitypermission/http://www.morganskinner.com/Articles/StrongNameIdentityPermission/

感谢

限制.DLL访问

您可以将DLL2中的所有类型设置为internal,并将其中的InternalsVisibleToAttribute设置为DLL1。

为了确保这不会被破坏,您应该对DLL1进行签名,并确保在属性中使用其公钥。


或者,作为两个DLL的作者,可以考虑将项目合并为一个项目,将DLL2中存在的所有公共方法都设置为internal,就像以前一样,但现在只有DLL1存在,并且只能由它访问。


注:以上所有内容均假定不使用反射。

您可以使用反射来检查当前调用堆栈。说我可能不会这么做,因为它既昂贵又缓慢。

你可以通过这种方式获得堆叠比赛:

using System.Diagnostics;
// get call stack
StackTrace stackTrace = new StackTrace();
// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);

您可以使用ILMerge 将输出合并到单个exe中