【问题标题】:Invoke method with Reflection from an exe on a network drive从网络驱动器上的 exe 调用反射方法
【发布时间】:2013-07-10 21:42:24
【问题描述】:

我试图在网络驱动器上的 exe 中使用反射调用方法,但出现以下异常。

[2013-07-12 11:58:54 AM] 发生以下错误:异常有 被调用的目标抛出。内部异常 :System.Security.SecurityException: 请求类型的权限 'System.Security.Permissions.FileIOPermission, mscorlib, 版本=2.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089' 失败的。在 System.Security.CodeAccessSecurityEngine.Check(对象 需求,StackCrawlMark& stackMark,布尔 isPermSet)在 System.Security.CodeAccessPermission.Demand() 在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess 访问、Int32 权限、布尔用户权限、FileShare 共享、Int32 bufferSize,FileOptions 选项,SECURITY_ATTRIBUTES secAttrs,字符串 msgPath, Boolean bFromProxy) 在 System.IO.FileStream..ctor(String 路径、FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize,FileOptions 选项)在 System.IO.StreamWriter.CreateFile(字符串路径,布尔附加)在 System.IO.StreamWriter..ctor(字符串路径,布尔附加,编码 编码,Int32 bufferSize) 在 System.IO.StreamWriter..ctor(String 路径,布尔附加,编码编码)在 System.IO.File.AppendAllText(字符串路径,字符串内容,编码 编码)在 System.IO.File.AppendAllText(字符串路径,字符串 内容)在 ccc.ControllerBO.ExecuteTest()

我已阅读安全设置,但我不想安装调用程序 EXE 并且找不到解决方案。

我能做些什么来克服这个问题?

【问题讨论】:

    标签: c# security reflection


    【解决方案1】:

    您可以将可执行文件复制到您自己的程序集的本地位置并从那里调用它。

    【讨论】:

    • 最简单的方法,制作临时本地文件夹并复制exe和依赖项。
    【解决方案2】:

    您可以创建证据实例并将其传递给 LoadForm 方法,如下所示:

    #if NET35
                var evidence = new System.Security.Policy.Evidence();
                evidence.AddHost(new System.Security.Policy.Url(assemblyPath));
                evidence.AddHost(new System.Security.Policy.Zone(System.Security.SecurityZone.MyComputer));
                Assembly assembly = Assembly.LoadFrom(assemblyPath, evidence);                        
    #elif NET40
                var evidence = new System.Security.Policy.Evidence();
                evidence.AddHostEvidence(new System.Security.Policy.Url(assemblyPath));
                evidence.AddHostEvidence(new System.Security.Policy.Zone(System.Security.SecurityZone.MyComputer));
                Assembly assembly = Assembly.LoadFrom(assemblyPath);                        
    #endif
    

    其中 assemblyPath - 是包含程序集的文件的完整路径(例如在网络驱动器上)。

    【讨论】:

    • 好的,所以如果我添加主机,我无法加载已安装的 dll。我也应该添加已安装的 dll 吗?
    • 该程序集不允许部分受信任的调用者。
    • 我测试了一个简短的样本(对于案例 .NE 3.5)。我有强名称程序集 (test.dll) 和示例应用程序 (test.exe)。我通过反射加载程序集并从 dll 中的类调用方法。它在所有情况下都可以正常工作:1. exe 和 dll 都放在网络共享中 2. exe 和 dll 都放在本地文件夹中 3. exe 在本地文件夹中,dll 在 gac 中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-19
    相关资源
    最近更新 更多