2

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

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

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

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

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

谢谢!

4

2 回答 2

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();
}

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

public class MyAddIn : IAddIn
{
    public void Initialize()
    {
        Console.WriteLine("Hello from a remote assembly!");
        Console.ReadLine();
    }
}
于 2012-08-25T07:29:50.690 回答
-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

于 2015-11-17T10:56:59.370 回答