C# 如何使动态加载的程序集中的设置提供程序可用于反射?

C# 如何使动态加载的程序集中的设置提供程序可用于反射?,c#,reflection,.net-assembly,settingsprovider,C#,Reflection,.net Assembly,Settingsprovider,接下来,我在我们正在开发的传统C#应用程序中成功创建了自定义设置提供程序。它通过设置Provider属性引用: public sealed class MySettings : SettingsProvider { ... } [SettingsProvider(typeof(MySettings))] internal sealed partial class Settings {} 然而,现在我遇到了另一个问题 我们的客户机应用程序包括一个自动更新功能,它的实现使得客户机的大部分

接下来,我在我们正在开发的传统C#应用程序中成功创建了自定义设置提供程序。它通过
设置Provider
属性引用:

public sealed class MySettings : SettingsProvider
{
    ...
}

[SettingsProvider(typeof(MySettings))]
internal sealed partial class Settings {}
然而,现在我遇到了另一个问题

我们的客户机应用程序包括一个自动更新功能,它的实现使得客户机的大部分(包括上面的类)被构建到一个DLL中(我们在这里称之为client.DLL),然后由一个EXE使用。EXE首先检查更新,并在需要时从更新服务器下载最新的更新,用更新版本(包括client.dll)替换所有dll等。为了能够在运行时替换DLL,它不能静态链接到它们。因此,更新后,它将加载client.dll并按如下方式运行:

Assembly assy = Assembly.LoadFile(
        AppDomain.CurrentDomain.BaseDirectory + "client.dll");
object frm = assy.CreateInstance("Client.Forms.MainForm");
Application.Run((Form)frm);
不幸的是,框架在动态加载的程序集中找不到自定义设置提供程序类。我尝试使用
LoadFrom
而不是上面的
LoadFile
,但没有效果。到目前为止,我找到的唯一可行的解决方案是在loader exe中实现一个代理类,该类的名称与真实设置提供程序的名称相同,这是由框架找到的。然后,代理从客户端程序集中实例化real settings提供程序,并将所有调用委托给它

这似乎有效,但我不满意。有没有办法帮助框架直接在动态加载的程序集中找到我的类

更新 我收到的错误消息是:

System.Configuration.ConfigurationErrorsException: Failed to load provider type: Client.Properties.MySettings, Client, Version=4.0.1341.0, Culture=neutral, PublicKeyToken=null.
   at System.Configuration.ApplicationSettingsBase.get_Initializer()
   at System.Configuration.ApplicationSettingsBase.CreateSetting(PropertyInfo propInfo)
   at System.Configuration.ApplicationSettingsBase.EnsureInitialized()
   at System.Configuration.ApplicationSettingsBase.get_Properties()
   at System.Configuration.SettingsBase.GetPropertyValueByName(String propertyName)
   at System.Configuration.SettingsBase.get_Item(String propertyName)
   at System.Configuration.ApplicationSettingsBase.GetPropertyValue(String propertyName)
   at System.Configuration.ApplicationSettingsBase.get_Item(String propertyName)
   at Client.Properties.Settings.get_SomeConfigSetting()
   at ...
通过调试和日志消息,我确定从未调用该类的初始值设定项方法,因此从未实例化该类。换句话说,在上述异常背后似乎没有隐藏的初始化错误

还有一点很重要:客户端目前运行在.NET2.0上,在可预见的将来没有升级计划

更新2 根据@jwddixon的回答,我开始调查AppDomain。首先,我想检查Client.dll是否真的位于与调用方EXE不同的应用程序域中。所以我列出了当前应用程序域中的程序集,并看到客户端实际上就在那里。但令我惊讶的是,我注意到列表中实际上有两个名为Client的程序集-EXE和DLL都有相同的程序集名称,但版本不同(EXE为4.0.0.0,DLL目前为4.0.1352.0)。到目前为止,我还没有完全意识到这一点,这可能很重要。下一步我将尝试更改EXE程序集名称

更新3
…这实际上解决了问题!啊。。。对于我不知名的前辈们,他们为谁知道为什么而发明了这个扭曲的计划,我此刻有着非常不稳定的想法。。。但感谢你们所有人提出的问题和想法,最终导致了解决方案

我还没试过这个,但是像这样的一个怎么样:

AppDomainSetup setup = AppDomain.CurrentDomain.SetupInformation;
AppDomain domain = AppDomain.CreateDomain("myAppDomain", null, setup)
setup.ApplicationBase = file;

Assembly assy = domain.Load(AssemblyName.GetAssemblyName(
AppDomain.CurrentDomain.BaseDirectory +
 "client.dll"));

object frm = assy.CreateInstance("Client.Forms.MainForm");
Application.Run((Form)frm);

尝试使用Activator类创建“Client.Forms.MainForm”。当您说“框架找不到我的自定义设置提供程序类”时,是否有错误?你能再扩展一点吗?@SimonMourier,请看我的更新。所以这更像是一个程序集加载问题,对吗?您是否尝试将提供程序类型名称指定为其他名称,例如“Client.Properties.MySettings,Client”w/o version等。哦,好的,我想现在就知道了:-)在执行任何操作之前挂起AppDomain.CurrentDomain.AssemblyResolve事件,并在请求时指向正确的程序集如何?听起来很有希望(我也在考虑这一点,添加了一些关于从何处获取装配信息等的信息。),但可以详细说明吗?它的作用是什么?您基本上希望访问当前应用程序域之外的类似乎是合理的。Microsoft使用应用程序域来确保您不会偏离分配的边界。为了获得域之外的完全访问权,您首先需要创建自己的,然后将DLL加载到其中.此时(只要设置正确)您可以创建外部对象的本地实例。您可能还需要手动将您无权访问的类加载到本地内存中。示例中引用了
文件
变量,但从未定义过-您可以添加它吗?虽然您没有给出确切的解决方案,但您的答案为查找根源提供了重要提示e、 所以我给你赏金(否则它无论如何都会丢失)。