假设我有两个.dll,Dll1和Dll2。
DLL1使用或调用DLL2。
有没有办法可以确保它是DLL1而且只有DLL1才能调用DLL2?
更新1
背后的原因是:
我有一个WinForms解决方案,为了简单起见,它包含一个视图项目和一个控制器项目(生成一个单独的.dll)。在客户端计算机上安装应用程序后,我意识到可以在其“Program Files”文件夹中查看应用程序.dll。有人可能会添加对控制器的.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/
由于
答案 0 :(得分:6)
您可以在DLL2 internal
中创建所有类型并在其中使用InternalsVisibleToAttribute
设置为DLL1。
为了确保不会破坏它,您应该签署DLL1并确保在属性中使用其公钥。
或者,作为两个DLL的作者,考虑将项目组合成一个 - 将DLL2中存在的所有公共方法设置为internal
,如前所述,但现在只有DLL1存在且只能通过它
注意:以上所有假设均未使用反射。
答案 1 :(得分:2)
您可以使用Reflection来检查当前的callstack。说我可能不会这样做,因为它昂贵且缓慢。
您可以通过这种方式获得堆栈跟踪:
using System.Diagnostics;
// get call stack
StackTrace stackTrace = new StackTrace();
// get calling method name
Console.WriteLine(stackTrace.GetFrame(1).GetMethod().Name);
答案 2 :(得分:1)
您可以使用ILMerge
将输出合并到单个exe中