【问题标题】:How to change configSections, section, type element? Specifically Version如何更改 configSections、section、type 元素?具体版本
【发布时间】:2012-05-28 00:42:15
【问题描述】:

我在这里和 CodeProject 发布我的问题,作为关于配置文件奥秘的著名文章系列的question

来自文章:

您可以选择指定文化、版本和公钥(例如 签名的程序集)值,如果您希望确保只有特定的 当您的 .config 文件是时搜索程序集的版本 已解析。

我正在使用以下代码打开并初始化配置文件:

ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = path;
config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);
section = (OptionsSection)config.GetSection("myoptionsdata");
if (section == null)
{
    section = new OptionsSection(0, "aaaa", "bbbb", "cccc",14);
    config.Sections.Add("myoptionsdata", section);
    config.Save(ConfigurationSaveMode.Full);
}

这将创建以下内容:

<configSections>
    <section name="myoptionsdata" type="my.namespace.OptionsSection, myAssembly,
      Version=1.0.3.0, Culture=neutral, PublicKeyToken=111222aaaabbb"
      allowLocation="true" allowDefinition="Everywhere"
      allowExeDefinition="MachineToApplication" overrideModeDefault="Allow"
      restartOnExternalChanges="true" requirePermission="true" />
</configSections>

注意“类型”如何具有版本、文化和 PublicKeyToken。我需要消除这些,或者至少是版本。问题是我使用特定版本部署应用程序,然后我升级版本并发布更新。但是当对配置进行读取时,它会失败,因为版本是显式的。

所以我真正想要的是:

<configSections>
    <section name="myoptionsdata" type="my.namespace.OptionsSection, myAssembly" />
</configSections>

我从未见过包含扩展类型值的示例。每个示例都显示 Save() 创建 type="namespace.class,assembly",但这似乎不是默认行为。

那么,参考上面的引用,我在哪里可以找到有关管理这些“可选”值的信息?

对于任何使用谷歌搜索的人来说,这是导致以下臭名昭著错误的原因之一:

异常:创建配置部分时出错 myoptionsdata 的处理程序:无法加载文件或程序集 'myAssembly,版本=1.0.3.0,文化=中性, PublicKeyToken=111222aaaabbb' 或其依赖项之一。位于 程序集的清单定义与程序集引用不匹配。 (来自 HRESULT 的异常:0x80131040) (C:\Users\me\AppData\Roaming\product\dir\name.config 第 4 行)

我相信我的问题与this one 类似,到目前为止还没有收到任何回复。

“离开菜单”,我只想将配置文件部署到特定位置(非默认)并允许用户以工具>选项形式设置选项。大多数应用程序都这样做。有没有简单且普遍接受的方法来做到这一点?我应该注意我的应用程序是 Outlook 插件,我这样做是因为我想将插件设置存储在插件特定的配置文件中,而不是 Outlook 配置附近的任何地方。

【问题讨论】:

    标签: c# configuration configsection


    【解决方案1】:

    包含您的自定义配置部分的程序集具有强名称。对程序集进行强命名会显式阻止您想要进行的那种就地版本升级。从该程序集中删除强名称,程序集加载器将不再关心它是什么版本。

    【讨论】:

    • 完全错过了。说得通。但是,面向普通受众的 MS Office 插件必须具有强名称。这个问题得到了回答(也很快)。但要完成图片,似乎获得我需要的唯一方法是自定义编码整个 XML 配置文件并跳过 FCL。那是对的吗?谢谢!!!
    • 只需使用适当的公共字段定义类并在其上使用 DataContractSerializer。真的,您从 ConfigurationManager 获得的唯一好处是您不必手动打开文件...
    • 同意。我觉得拍额头很傻。我将只序列化一个简单的数据类,而不用担心 XML 或其他复杂性。有时,简单的答案让我们望而却步。感谢您的清晰思考。
    • 另一种解决方法,如果您更喜欢使用应用程序配置文件,则在另一个程序集中实现自定义配置部分。因此,如果配置节程序集(强命名)没有更改,您不必在配置文件中更新其名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多