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

时间:2012-08-25 05:48:26

标签: visual-studio-2010 c#-4.0 app-config remoteobject

我目前有一个app.config,其配置值如下:

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

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

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

我理解使用app.config的优点和缺点,但我不想有一个。

谢谢!

2 个答案:

答案 0 :(得分:8)

我找不到在代码中启用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();
    }
}

答案 1 :(得分:-1)

我认为解决问题的最佳方法是编辑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中记录了此解决方案