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

Lan*_*ens 2 app-config remoteobject visual-studio-2010 c#-4.0

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

<configuration>
 <runtime>
  <loadFromRemoteSources enabled="true" />
 </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢!

Joe*_*ley 9

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

您可以改为使用" CAS策略的更多隐式使用:loadFromRemoteSources "中描述的技术.他们建议创建一个新的应用程序域PermissionState.Unrestricted,并将远程程序集加载到那里.NotSupportedException当您尝试加载远程程序集时,以这种方式创建的应用程序域不会抛出.

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

这是一个示例程序,在执行时立即创建一个新的应用程序域,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();
}
Run Code Online (Sandbox Code Playgroud)

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

public class MyAddIn : IAddIn
{
    public void Initialize()
    {
        Console.WriteLine("Hello from a remote assembly!");
        Console.ReadLine();
    }
}
Run Code Online (Sandbox Code Playgroud)