假设我有两个.dlls,Dll1和Dll2。
DLL1使用或调用DLL2。
有什么办法可以确保是DLL1,只有DLL1才能把电话打到DLL2中?
更新1
这背后的原因是:
我有一个WinForms解决方案,为了保持它的简单,它由一个视图项目和一个控制器项目(它生成一个独立的.dll)组成。在客户端计算机上安装应用程序之后,我意识到可以在它的"Program“文件夹中查看应用程序.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/
谢谢
发布于 2012-02-27 13:37:31
您可以在DLL2 internal中创建所有类型,并将InternalsVisibleToAttribute设置为DLL1。
为了确保这不会被破坏,您应该对DLL1进行签名,并确保在属性中使用它的公钥。
或者,作为两个DLL1的作者,考虑将项目组合成一组DLL2到internal中存在的所有公共方法,就像以前一样,但是现在只有DLL1存在,它们只能被DLL1访问。
注意:以上所有假设都不使用反射。
发布于 2012-02-27 13:37:00
可以使用反射检查当前的调用堆栈。说我可能不会这么做,因为它既昂贵又缓慢。
您可以这样获得堆栈跟踪:
using System.Diagnostics;
// get call stack
StackTrace stackTrace = new StackTrace();
// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);发布于 2012-02-27 14:13:44
您可以将输出与ILMerge合并为单个exe。
https://stackoverflow.com/questions/9465903
复制相似问题