如何更改configSections,section,type元素?具体版本

时间:2012-05-28 00:42:15

标签: c# configuration configsection

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

来自文章:

  

您可以选择指定文化,版本和公钥(for   如果您希望仅确保特定的,则签名的程序集)值   在.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>

注意'type'如何包含Version,Culture和PublicKeyToken。我需要消除这些,或者至少是版本。问题是我使用特定版本部署应用程序,然后我碰撞版本并发布更新。但是当在配置上完成读取时,它会失败,因为版本是显式的。

所以我真正想要的就是这个:

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

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

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

对于任何谷歌搜索,这是下面臭名昭着的错误的原因之一:

  

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

我相信我的问题类似于this one,到目前为止还没有得到任何答复。

“离开菜单”,我只想将配置文件部署到特定位置(非默认),并允许用户在工具&gt;选项排序形式中设置选项。大多数应用都这样做。这有什么简单和普遍接受的方式吗?我应该注意到我的应用程序是一个Outlook Addin,我这样做我的配置文件,因为我想将addin设置存储在一个特定于addin的配置文件中,而不是放在Outlook配置附近。

1 个答案:

答案 0 :(得分:3)

包含自定义配置部分的程序集具有强名称。对程序集进行强命名会明确阻止您要执行的就地版本升级。从该程序集中删除强名称,程序集加载程序将停止关注它的版本。