我有一个程序集,除了指定的可执行文件之外,不应该被任何应用程序使用.请给我一些指示.
您可以使用相同的密钥对程序集和可执行文件进行签名,然后检查要保护的类的构造函数:
public class NotForAnyoneElse { public NotForAnyoneElse() { if (typeof(NotForAnyoneElse).Assembly.GetName().GetPublicKeyToken() != Assembly.GetEntryAssembly().GetName().GetPublicKeyToken()) { throw new SomeException(...); } } }
在.Net 2.0或更高版本中,将所有内容都设置为内部,然后使用朋友程序集
http://msdn.microsoft.com/en-us/library/0tke9fxk.aspx
这不会停止反思.我想结合下面的一些信息.如果你绝对需要阻止任何人打电话,可能最好的解决方案是:
ILMerge .exe和.dll
混淆最终的.exe
您还可以检查调用堆栈并获取每个调用者的程序集,并确保它们都使用与程序集相同的键进行签名.
没有跳过一些篮球,100%完全不可能.
使用.NET的一个好处是能够使用反射,即加载程序集并检查它,动态调用方法等.这使得VB.NET和F#之间的互操作成为可能.
但是,由于您的代码位于托管程序集中,这意味着任何人都可以添加对代码的引用并调用其公共方法或使用反射和调用私有方法加载它.即使你"混淆"了你的代码,人们仍然可以使用反射并调用你的代码.但是,由于所有的名字都会被掩盖做任何事情都是非常困难的.
如果您必须以阻止其他人执行它的方式发送您的.NET代码,您可能能够将您的二进制文件(编译为x86)并运送这些二进制文件.
我不知道你的具体情况,但混淆应该足够好.