我有各种项目使用反射来访问和调用某些框架类中的私有或内部成员。
这些项目在我的机器上运行正常(运行visual basic express 2008),但是它们是否可以保证在另一台机器上工作,或者说,通过网络工作?
我看过ReflectionPermission,但我不确定是否需要给予我或者我是否将其授予我的项目!
我并不像这个问题那样愚蠢,老实说!
答案 0 :(得分:2)
运行程序的计算机需要将ReflectionPermission授予程序。
如果用户从本地文件系统运行程序,这将没有问题。如果用户从网络共享,Intranet,Internet等运行程序,则可能会出现问题,具体取决于运行程序的计算机的策略。策略还可以考虑诸如原始URL或网络共享之类的因素,程序是否已签名等。例如,如果这是Intranet应用程序,则网络管理员可以允许对来自http://our_site/approved_apps/的程序的高度信任。已签名,但不是来自内部网其他部分或未签名的程序。
在任何情况下,它都在您的控制之外:您的程序集可以声明它需要ReflectionPermission,但它是否被授予取决于目标系统的配置。 (但同样,如果你的程序从本地文件系统运行,它应该不是问题,因为它将以完全信任的方式运行,除非有人真的锁定了机器。)
答案 1 :(得分:2)
如果您可以执行代码,那么您应该能够使用反射来查询它。
从我对ReflectionPermission MSDN page的阅读中,您似乎需要使用它来访问所有对象成员:
如果没有ReflectionPermission,代码可以使用反射来仅访问对象的公共成员。具有ReflectionPermission的代码和相应的ReflectionPermissionFlag标志可以访问对象的受保护和私有成员。
答案 2 :(得分:2)
只要从本地驱动器运行它们,它们就可以在任何机器上正常工作。默认情况下,从.NET上的网络共享运行可执行文件到3.5SP1将使您以简化信任模式(Internet或Intranet)运行,并且您将无法访问ReflectionPermission,这意味着您将无法访问受保护的或私人会员。
从3.5SP1开始,他们已经改变了可执行文件的操作,如果直接运行则给予他们完全信任(而不是通过Assembly.Load和类似的方式加载到另一个进程)。
您还可以使用作为框架一部分的caspol工具向程序集授予特定权限。有关caspol的更多信息,请参阅this。