如何禁止引用.NET DLL类库?

3
如何禁止在其他解决方案中引用dll类库?

可能是重复问题:https://dev59.com/03VD5IYBdhLWcg3wE3Xz - Cody Gray
把所有的类都设为internal,只允许特定程序集使用,这样做是否会有问题? - leppie
因为我需要在同一个解决方案中引用我的SecreteLibrary.dll和MyProgram.exe。 - Simon
4个回答

6
您可以考虑为类库添加一个StrongNameIdentityPermission,使其与您希望能够使用它的程序的strong name匹配。
另外,您也可以尝试使用InternalsVisibleToAttribute,但这可能需要对您的库代码进行一些设计更改。只要没有任何一个程序集被签名或两个程序集都使用强名称签名,这应该是可行的。在属性上指定的参数应匹配公钥和您想要访问其内部成员的程序集的名称。
但实际上,这只会阻止那些不太努力使用您的库的人。他们将无法添加引用,但这并不能防止通过反射或反编译绕过它。几乎任何安全措施都有方法可以绕过。

@Cody Gray:好的,我已经像那篇文章中所说的那样签署了我的主程序集。现在我遇到了构建错误,其他引用的库:错误5:程序集生成失败--引用的程序集'MyProgram.Library'没有强名称。 - Simon
@Simon:是的,现在你需要签名你程序所引用的所有其他程序集。它会抛出错误,因为已签名的程序集不能引用其他未签名的程序集。就像我上面提到的那样,你必须要么没有程序集使用强名称签名,要么所有程序集都使用了强名称签名。 - Cody Gray
@Simon:这取决于你。你可能会发现这个问题的答案很有启发性。最终,我建议你用同一把密钥签署它们,但确保它们有不同的名称。 - Cody Gray
1
在 .Net 3.5 SP1 中,StrongNameIdentityPermission 在完全信任的环境中将被忽略,例如在本地计算机上运行。请参阅 http://msdn.microsoft.com/en-us/library/cc713694.aspx。 - Lars Truijens
@Lars:这是一个很好的观点。强名称验证是为了使加载器更快而被取消的其中之一。我以为是.NET 4.0取消了这个额外的步骤,现在知道它早在.NET 3.5 SP1时期就已经取消了。 - Cody Gray
显示剩余4条评论

5

我想知道为什么该页面的英文版本缺少德文版本中非常有用的示例:http://msdn.microsoft.com/de-de/library/system.security.permissions.strongnameidentitypermission.aspx - VVS
切换到英文版的 .net 3.5。 - Simon
1
在 .Net 3.5 SP1 中的完全信任环境中将被忽略,例如在本地计算机上运行。请参阅 http://msdn.microsoft.com/en-us/library/cc713694.aspx。 - Lars Truijens

-1

你可以通过将“构建操作”属性设置为“嵌入资源”,将DLL嵌入到EXE中。这样你的DLL就不会作为单个文件被发送,也没有人能够使用它。


当然,这需要在应用程序启动时解压DLL文件,这不仅会出现许多潜在的权限问题(以及诸如Windows数据执行预防之类的问题),而且意味着任何人都可以在运行时复制DLL文件并随心所欲地使用它。 - Cody Gray

-1

你可以通过一些dll类方法,使其在未被自己的主程序使用时失败。

 Assembly main = System.Reflection.Assembly.GetExecutingAssembly();

 if (main.FullName != .....)
     throw new NotSupportedException();

或者

 if (IsSignedWith(main, myCompanysX509Certificate))
     throw new NotSupportedException();

我在哪里可以找到IsSignedWith方法?而且关于参数main和myCompanysX509Certificate,它们代表什么意思?谢谢。 - Simon
IsSignedWith 是一个示例,您可以查询主 exe 文件的一些属性。也许您可以查询主.exe 是否使用证书签名。 - k3b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接