gpt4 book ai didi

.net - AppDomains 和 configSections

转载 作者:行者123 更新时间:2023-12-04 07:01:01 24 4
gpt4 key购买 nike

我们在 .NET 3.5 应用程序中使用 CSLA(一个相当古老的版本),并且我们为一些用户使用它的 NetRun 应用程序加载。对于那些不熟悉 NetRun 的人来说,NetRun.exe 基本上是一个安装在用户计算机上的应用程序“运行器”(例如到 c:\Program Files\NetRun\NetRun.exe)。用户只需通过启动 NetRun.exe 即可启动应用程序。

NetRun.exe 的作用如下:

(1) 创建一个新的 AppDomainSetup

Dim setupDomain As New AppDomainSetup()
setupDomain.ApplicationBase = CurrentDomainPath() ' this will be C:\Program Files\NetRun\
setupDomain.ConfigurationFile = "http://www.ourdomain.com/TheApp.xml" ' The app.config file is actually named TheApp.xml on the server because it has NetRun-specific config settings that don't belong in the standard TheApp.config that is used when the app is running directly from the server.

(2) 然后使用该 AppDomainSetup 创建一个新的 AppDomain
' create new application domain 
Dim newDomain As AppDomain = AppDomain.CreateDomain("TheApp", Nothing, setupDomain)

(3) 然后 NetRun.Launcher(一个启动助手类——主要用于常见的启动画面)在新的 AppDomain 中通过以下方式实例化:
' create launcher object in new appdomain
Dim launcher As Launcher = CType(newDomain.CreateInstanceAndUnwrap("NetRun", "NetRun.Launcher"), Launcher)

(4) 然后luncher helper类在新的AppDomain中通过
' use launcher object from the new domain to launch the remote app in that appdomain
launcher.RunApp()

(5) 在所有启动画面之后,应用程序最终通过以下方式启动
Dim ass = Assembly.LoadFrom("http://www.ourdomain.com/TheApp.exe")
ass.EntryPoint.Invoke(ass.EntryPoint, Nothing)

因此,回顾一下,实际运行的应用程序的 AppDomain 的 ApplicationBase 是 C:\Program Files\NetRun\,而实际应用程序的 EntryPoint 位于“ http://www.ourdomain.com/TheApp.exe”中。到现在为止还挺好。

应用程序本身,除了 TheApp.exe 之外,还作为对 ALibrary.dll 的依赖。迄今为止,这对我们来说效果很好。即使当 ALibrary.dll 有被拉入 TheApp.xml 文件的配置条目时,这些配置条目也一直被很好地读取(并继续这样做)。

在即将发布的版本中,我们添加了一个新的自定义配置文件部分,该部分在 ALibrary.dll 中定义。我们将新部分添加到 TheApp.xml 和 TheApp.config 文件中
<configSections>
<sectionGroup name="applicationSettings" type="System.Configuration.Applicat...">
<section name="TheApp.My.MySettings" type="System.Configuration.ClientSettingsS..."/>
<section name="ALibrary.My.MySettings" type="System.Configuration.ClientSettingsS..."/>
</sectionGroup>
<!-- NEW CONFIG SECTION -->
<section name="fixedPriceExceptionModel" type="ALibrary.Configuration.FixedPrices.FixedPriceExceptionModelSection, ALibrary"/>
</configSections>

(在这篇文章中,为了节省空间,部分内容已被删除)

但是,当我们尝试通过“正常”方式访问 NetRun 启动的 TheApp.exe 中的新部分时
CType(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) _
.GetSection("fixedPriceExceptionModel"), FixedPriceExceptionModelSection)

我们得到以下异常:

An error occurred creating the configuration section handler for fixedPriceExceptionModel: Could not load file or assembly 'ALibrary' or one of its dependencies. The system cannot find the file specified. (http://www.ourdomain.com/TheApp.xml line 8)



做一些研究,这是因为 .NET 配置库的程序集解析器在所有常见位置寻找 ALibrary.dll; ApplicationBase、特定的子目录、.NET 核心目录,然后是 GAC。不幸的是,永远不会在任何这些位置找到 ALibrary.dll。当这个应用程序直接在服务器上运行时,没有 NetRun,应用程序不会抛出异常并正确读取配置部分。

我尝试过的一件事是以不同的方式设置 AppDomainSetup,因为它的 ApplicationBase 将设置为 http://www.ourdomain.com/ ,但随后对 CType(newDomain.CreateInstanceAndUnwrap("NetRun", "NetRun.Launcher"), Launcher) 的调用会爆炸,因为 NetRun.exe 不在服务器上。

这可能需要很多东西,我希望我描述得足够好(并且没有让你感到厌烦)。也许没有简单的解决方案,但我已经用尽了我对这个领域的有限知识,并希望 SO 上的其他人可能有神奇的修复,允许我在 NetRun 和本地运行应用程序时可靠地访问自定义配置部分。

最佳答案

据我了解这个问题,问题是代码在客户端机器上运行,而没有真正(物理)存在的程序集,因为它们是从服务器加载的。

知道了,你有两个选择:
1. 努力寻找现有代码的解决方案;)
2. 不使用自定义配置节处理程序。

就个人而言,我会选择#2。

不要使用 ALibrary.Configuration.FixedPrices.FixedPriceExceptionModelSection 作为您的配置部分处理程序(这会导致异常,因为在客户端上找不到这种类型),而是像其他部分一样使用默认的 System.Configuration.ClientSettingsSection - 这是 . NET Framework,所以客户端没有问题。之后,为所需的配置类创建一个工厂(如果您真的需要强类型),它将逐步读取配置并创建您的 FixedPriceExceptionModel 对象,填充数据并可供任何需要它的人使用。

如果我误解了这个问题,请告诉我。

关于.net - AppDomains 和 configSections,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1842605/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com