C# 通过代码而不是 app.config 配置 LoadFromRemoteSources?

Posted

技术标签:

【中文标题】C# 通过代码而不是 app.config 配置 LoadFromRemoteSources?【英文标题】:C# Configure LoadFromRemoteSources through code not app.config? 【发布时间】:2012-08-20 14:48:23 【问题描述】:

我目前有一个具有以下配置值的 app.config:

<configuration>
 <runtime>
  <loadFromRemoteSources enabled="true" />
 </runtime>
</configuration>

到目前为止,我已经能够从我的 app.config 中删除所有其他内容,并仅使用纯 C# 代码进行配置,除了 loadFromRemoteSources

有没有办法通过C#代码启用loadFromRemoteSources

我了解拥有 app.config 的利弊,但我不想拥有。

谢谢!

【问题讨论】:

【参考方案1】:

我找不到在代码中启用loadFromRemoteSources 的任何方法,如果有的话,我怀疑它是否允许您在创建应用程序域后将其应用到应用程序域。但我可能错了!

您可以改用“More Implicit Uses of CAS Policy: loadFromRemoteSources”中描述的技术。他们建议使用PermissionState.Unrestricted 创建一个新的应用程序域,并将远程程序集加载到那里。当您尝试加载远程程序集时,以这种方式创建的应用程序域不会抛出 NotSupportedException

他们将此技术描述为当您只想加载完全信任的一些远程程序集,因此不想在您的 app.config 中启用loadFromRemoteSources 时的解决方案。您可以使用相同的技术,但将您的整个程序加载到新的应用程序域中。

这是一个示例程序,当它执行时,会立即创建一个带有PermissionState.Unrestricted 的新应用程序域并在其中运行:

public class Program : MarshalByRefObject

    public Program()
    
        Console.WriteLine("Program is running.");
        Assembly remoteAssembly = Assembly.LoadFrom(
            @"\\server\MyRemoteAssembly.dll");
        IAddIn addIn = (IAddIn)remoteAssembly.CreateInstance("MyAddIn");
        addIn.Initialize();
    

    static void Main()
    
        // This program needs to run in an application domain with
        // PermissionState.Unrestricted, so that remote assemblies can be loaded
        // with full trust. Instantiate Program in a new application domain.
        PermissionSet permissionSet =
            new PermissionSet(PermissionState.Unrestricted);
        AppDomainSetup setup = new AppDomainSetup();
        setup.ApplicationBase =
            AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
        AppDomain appDomain = AppDomain.CreateDomain(
            "Trusted Domain", null, setup, permissionSet);
        appDomain.CreateInstance(
            Assembly.GetExecutingAssembly().FullName, "Program");
    


public interface IAddIn

    void Initialize();

这里是 MyRemoteAssembly.dll 的源代码,您可以将它放在您的网络共享中:

public class MyAddIn : IAddIn

    public void Initialize()
    
        Console.WriteLine("Hello from a remote assembly!");
        Console.ReadLine();
    

【讨论】:

当我有上面的代码然后做trustedRemoteLoadDomain.Load("Path/To/File/Or/URL");我得到错误的代码库异常。如果我复制程序集,使其位于正在运行的程序集旁边并执行 Assembly.Load 它可以完美运行。为什么? 在本地复制程序集允许以完全信任的方式加载它。如果这是一个选项,那么无论如何您都不需要 loadFromRemoteSource。也许编辑您的问题以解释您在做什么需要启用 loadFromRemoteSource? 这只是一个测试,当应用程序处于活动状态时,它不会对 DLL 进行本地访问。 经过测试和一些修改以适应我的代码,它工作得很好,太棒了!非常感谢你的效果乔!!!! 这可能不适用于 OP 的情况,但在我的单元测试场景中,这对我有用:b2ben.blogspot.dk/2014/07/running-visual-studio-tests-from.html【参考方案2】:

我认为解决问题的最佳方法是编辑 app.config 文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
  <runtime>
    <loadFromRemoteSources enabled="true"/>
  </runtime>
</configuration>

你必须添加

  <runtime>
    <loadFromRemoteSources enabled="true"/>
  </runtime>

问题就解决了。此解决方案记录在 MSDN 中

【讨论】:

你读过这个问题吗? OP 专门询问如何在不使用 app.config 的情况下执行此操作。 @GMG: tihi;你很多。您所做的只是从 OP 复制/粘贴。你简直是在暗示他今天在做什么。

以上是关于C# 通过代码而不是 app.config 配置 LoadFromRemoteSources?的主要内容,如果未能解决你的问题,请参考以下文章

您如何使用 c# 4.0 app.config 中的部分?

C# 读写App.config配置文件的方法

C# 怎么保存WinForm应用程序的配置?

您可以在代码中配置 log4net 而不是使用配置文件吗?

C#如何动态修改app.config配置文件?

app.config 引用源代码路径而不是 dll 路径