带有app.settings的ArcMap加载项无法识别app.config的更改?


14

我已经开发了一个需要配置文件的ArcMap加载项。花了一段时间尝试从单个App.Config文件中读取配置值(并始终为null)之后,我相信该加载项无法从此处读取值,因为它是一个类库,并且正在寻找调用应用程序(ArcMap)我的配置文件,当我要求一个键的值(因此为null)时。

为了解决这个问题,我使用了一个App.Settings文件,该文件可以很好地读取。创建此文件还将在环境中引入一个App.Config文件,Visual Studio似乎在开发过程中使两个文件保持同步。

现在已经部署了外接程序,我需要能够更改配置值(例如,日志文件位置)。我尝试打开/解压缩.esriaddin文件并在那里更新App.Config文件,但是该加载项保留了与编译时相同的配置值。我知道新的App.Config值将保留在.esriaddin文件中,因为关闭存档后我可以再次查看它们。

有谁知道配置外接程序并允许此配置在部署后可更新的可靠方法?任何建议都非常受欢迎,因为我为此需要一个自定义配置文件似乎很荒谬。

App.Settings值在应用程序级别,并且当前App.Settings和App.Config都具有构建操作:无/不复制。

Answers:


8

我想出了如何配置插件。

每次ArcMap加载时,... Documents \ ArcGIS \ AddIns \ Desktop10.0 ...中的插件文件都会扩展,因此可以在此编辑插件中嵌入的任何配置文件的唯一位置。我没有尝试使用注册表项或专用的外接程序配置目录,因为这似乎有些过分。

最后,我使用了一个app.config文件(因为即使与一个类库一起使用,该文件库忽略了该配置文件,它仍然会根据程序集重命名并自动包含在addin存档中)用于我的设置。根据上面提供的链接,我使用了以下配置类

...

    public AppConfig()
    {
        try
        {
            ExeConfigurationFileMap map = new ExeConfigurationFileMap();
            map.ExeConfigFilename = this.GetType().Assembly.Location + ".config";
            config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        }
        catch (Exception)
        {
            ...
        }
    }

    private string getValue(string key) 
    {
        return config.AppSettings.Settings[key].Value;
    }

...

若要在部署外接程序后编辑配置,我必须关闭ArcMap,使用winrar打开.esriAddIn文件,转到\ install并打开配置文件,对其进行编辑,然后关闭编辑器,然后允许winrar在Windows中更新文件。存档。然后重新加载ArcMap,然后进行更改。令人讨厌的是,这是我尝试的第一件事,但是我认为我遇到了问题,因为当Winrar更新档案时,配置文件的编辑器仍处于打开状态。


您最近在使用OpenMappedExeConfiguration遇到任何错误吗?我使用了一种类似的方法,效果很好,直到几天前它停止工作,也许是在安装了一些Windows Update之后。请参阅我的这个StackOverflow问题
blah238

@ blah238我已经有一段时间没有测试过此加载项了,并且现在没有机会。但是,如果您可以总结一下您最近的Windows / .NET更新,则可以查看我的(Win7)是否匹配,并让您知道
tomfumb 2011年

我看到的唯一似乎相关的是.NET 4安全更新。不知道这是否还会影响我针对的.NET 3.5。
blah238

仅供参考,我最终重新编写了外接程序的配置逻辑,以使用传统的XML(反序列化)代替.NET配置系统,我认为,它的主要作用是将.config文件与.esriAddin文件中的程序集-据我所知,您不能对任意XML文件执行此操作-但出于我的目的,我决定我真的不需要提供默认配置,只需坚持用户特定的设置)。我仍然想知道这是否还会影响其他外接程序开发人员。
blah238

使用.config方法进行更多研究,Fusion显示ESRI正在使用Assembly.LoadFrom()加载加载项程序集。从我所阅读的内容来看,这与最佳实践相反,后者是为加载项设置单独的AppDomain,并且可以解释为什么ConfigurationManager不会费心寻找程序集的正确位置。我不明白的是为什么当它已经被加载到默认的AppDomain中时,它甚至需要再次寻找该程序集。我只能假定.NET安全更新开始强制更频繁地检查程序集位置。
blah238

6

类似的答案中借用,您可以在插件中使用它:

string configPath = System.IO.Path.Combine(this.GetType().Assembly.Location,"Config.xml");

感谢您的提示,以上创建的路径无效,因为它给出了... / addInName.dll / config.xml,但它使我走上了正确的轨道。我现在使用的是稍微简单this.GetType().Assembly.Location + ".config"
一点的-tomfumb

2

标准.NET配置文件是每个应用程序而不是每个库的文件。这意味着,当您的插件在ArcMap进程中运行时,需要在ArcMap.exe.config中指定您的配置设置,该设置必须放在ArcMap.exe旁边。

当然,这在生产环境中并不总是可能的,并且还违反了插件的隔离,这是首先引入插件的原因之一。

您将需要以其他方式存储您的设置,或者将其存储在您自己的配置文件中(如Kirk的回答所示)或系统注册表中。

您可以通过多种方式监视对配置文件的更改,例如,利用FileSystemWatcher类。


1

Kirk Kuykendall答案对我不起作用,因为它一直指向.dll本身。我使用以下内容指向配置文件

System.IO.StreamReader file = new System.IO.StreamReader(System.IO.Path.GetDirectoryName(this.GetType().Assembly.Location) + "\\config.cfg");

0

尽管我还没有研究过ESRI Addin的新模型,但我所做的和其他人看到的是注册表中UserHive的用户。然后,您可以在外接程序中有一个屏幕来更新所需值的可能性。

使用App.config文件往往要求您完全重新启动应用程序/扩展名以读取新值。同时更容易从注册表中进行即时更新。


0

您可以尝试修改位于“ 外接程序集”缓存中的配置文件的副本。我相信esriaddin只会被ArcGIS扩展一次。因此,可能不使用后续修改(尽管它应该注意esriaddin文件比其缓存新)。

Vista / 7:C:\ Users \\ AppData \ Local \ ESRI \ Desktop10.0 \ AssemblyCache

XP:C:\ Documents and Settings \\ Local Settings \ Application Data \ ESRI \ Desktop10.0 \ AssemblyCache


有趣的建议,但不幸的是,这没什么区别。ArcMap启动时,AssemblyCache目录中的配置文件被覆盖-我在此处和... \ Documents \ ArcGIS \ AddIns \ Desktop10的AddIn中更改了配置文件。 0,所以我不知道覆盖值来自哪里!
tomfumb

欣赏输入,但实际上看起来是每次应用程序加载时都会提取Documents \ ArcGIS \ AddIns \ Desktop10.0 \ .....中的.esriAddIn文件,因此丢失了外接程序集缓存中的所有更改。
tomfumb
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.