app.config 변경 사항을 인식하지 못하는 app.settings가있는 ArcMap 애드 인?


14

구성 파일이 필요한 ArcMap Add-in을 개발했습니다. 단일 App.Config 파일에서 구성 값을 읽으려고하는 동안 시간이 걸리고 항상 null을 얻는 경우 추가 기능은 클래스 라이브러리이므로 여기에서 값을 읽을 수 없으며 호출 응용 프로그램 (ArcMap)을 찾습니다. 키 값을 요청할 때 구성 파일 (따라서 null).

이 문제를 해결하기 위해 응용 프로그램에서 잘 읽을 수있는 App.Settings 파일을 사용했습니다. 이것을 만들면 App.Config 파일이 환경에 도입되고 Visual Studio는 개발 중에 두 파일을 동기화 상태로 유지하는 것 같습니다.

추가 기능을 배포 했으므로 구성 값 (예 : 로그 파일 위치)을 변경할 수 있어야합니다. .esriaddin 파일을 열고 압축을 풀고 App.Config 파일을 업데이트하려고 시도했지만 추가 기능은 컴파일 할 때와 동일한 구성 값을 유지합니다. 아카이브를 닫은 후 다시 볼 수 있기 때문에 새 App.Config 값이 .esriaddin 파일에 유지되고 있음을 알고 있습니다.

누구나 추가 기능을 구성하고 배포 후이 구성을 업데이트 할 수있는 안정적인 방법을 알고 있습니까? 이것에 대한 사용자 정의 구성 파일이 필요하다는 것은 어리석은 것처럼 보이므로 제안은 매우 환영합니다.

App.Settings 값은 응용 프로그램 수준에 있으며 현재 App.Settings와 App.Config 모두 빌드 작업이 있습니다. 없음 / 복사하지 않습니다.

답변:


8

addin을 구성하는 방법을 알아 냈습니다.

... Documents \ ArcGIS \ AddIns \ Desktop10.0 ...의 addin 파일은 ArcMap이로드 될 때마다 확장되므로 addin에 포함 된 모든 구성 파일을 편집 할 수있는 유일한 위치 는 여기에 있습니다. 레지스트리 키를 사용하거나 전용 addin 구성 디렉토리를 사용하여 실험하지 않았습니다.

결국 설정에 대해 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에서 파일을 업데이트해야합니다. 보관. 그런 다음 ArcMap을 다시로드하면 변경 사항이 적용됩니다. 성가신 것은 이것이 처음 시도한 것 중 하나이지만 winrar가 아카이브를 업데이트 할 때 구성 파일의 편집기가 여전히 열려 있기 때문에 문제가 있다고 생각합니다.


OpenMappedExeConfiguration에서 최근에 오류가 발생 했습니까? 며칠 전에 Windows Update를 설치 한 후 작동이 멈출 때까지 비슷한 방식을 사용했습니다. 내 StackOverflow 질문 을 참조하십시오 .
blah238

@ blah238이 추가 기능을 한동안 테스트하지 않았으므로 지금은 기회가 없습니다. 당신이 최근 윈도우를 요약 할 수 있습니다 그러나 경우 / .NET 내 (Win7에가) 일치 알려 경우 내가 볼 수있는 업데이트
tomfumb

내가 적절하다고 생각한 유일한 것은 .NET 4 보안 업데이트 였습니다. 그것이 내가 목표로하는 .NET 3.5에 영향을 줄 수 있는지 확실하지 않습니다.
blah238

참고로, 나는 .NET 구성 시스템 대신 전통적인 XML (de) 직렬화를 사용하기 위해 추가 기능의 구성 논리를 다시 작성하게되었습니다. 주된 그림은 .config 파일이 자동으로 추출됩니다 .esriAddin 파일의 어셈블리-내가 알 수있는 한 임의의 XML 파일로 할 수는 없지만 내 목적으로 기본 구성을 제공 할 필요가 없으며 지속성 만 유지하기로 결정했습니다. 사용자 별 설정). 그래도 이것이 다른 애드 인 개발자에게도 영향을 미치는지 알고 싶습니다.
blah238

.config 접근 방식과 Fusion을 사용하면 ESRI가 Assembly.LoadFrom ()을 사용하여 추가 기능 어셈블리를로드하고 있음을 알 수 있습니다. 필자가 읽은 내용에서 추가 기능을 위해 별도의 AppDomain을 설정하는 모범 사례에 위배되며 ConfigurationManager가 어셈블리를 올바른 위치로 찾지 않는 이유를 설명 할 수 있습니다. 내가 이해하지 못하는 것은 기본 AppDomain에 이미로드 된 어셈블리를 다시 찾아야하는 이유입니다. 어셈블리 위치를 더 자주 검사하도록 .NET 보안 업데이트가 시작되었다고 가정 할 수 있습니다.
blah238

6

비슷한 답변 에서 빌려 보면 addin에서 이것을 사용할 수 있습니다.

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 옆에 배치해야하는 ArcMap.exe.config에서 구성 설정을 지정해야합니다.

이것은 물론 프로덕션 환경에서 항상 가능하지는 않으며 addins의 격리를 위반합니다. 이것이 addins가 처음 도입 된 이유 중 하나입니다.

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의 사용자는 다른 사람이 수행하고 수행 한 작업입니다. 그런 다음 addin에 화면을 만들어 필요한 값을 업데이트 할 수 있습니다.

App.config 파일을 사용하려면 새 값을 읽으려면 앱 / 확장 프로그램을 완전히 다시 시작해야합니다. 레지스트리에서 즉시 업데이트를 수행하는 것이 더 쉽습니다.


0

애드 인 어셈블리 캐시 에있는 구성 파일의 복사본을 수정하려고 할 수 있습니다 . esriaddin은 ArcGIS에 의해 한 번만 확장된다고 생각합니다. 따라서 이후 수정 사항은 사용할 수 없습니다 ( esriaddin 파일이 캐시보다 최신 파일 임에 유의 해야 함 ).

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

XP : C : \ 문서 및 설정 \\ 로컬 설정 \ 응용 프로그램 데이터 \ ESRI \ Desktop10.0 \ AssemblyCache


흥미로운 제안이지만 불행히도 이것은 차이가 없었습니다 .ArcMap이 시작될 때 AssemblyCache 디렉토리의 구성 파일을 덮어 씁니다. 0이므로 덮어 쓰기 값이 어디에서 오는지 전혀 모릅니다!
tomfumb

입력을 감사하지만 Documents \ ArcGIS \ AddIns \ Desktop10.0 \ .....의 .esriAddIn 파일이 실제로는 응용 프로그램이로드 될 때마다 추출되므로 추가 기능 어셈블리 캐시의 모든 변경 내용이 손실됩니다.
tomfumb
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.