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?的主要内容,如果未能解决你的问题,请参考以下文章