2011-07-29 5 views
2

먼저, 매우 긴 질문에 대해 사과 드리겠습니다.ConfigurationManager.OpenMappedExeConfiguration.GetSection()이 실패했습니다 (방금 최근에 시작되었습니다).


나는 클래스 라이브러리가 추가 다른 프로그램 (ArcMap.exe)에 있기 때문에 GAC에 설치되지 않은 C의 # /. NET 3.5 클래스 라이브러리를 가지고있다. 이 프로그램은 실제로 시작시 아카이브의 .dll을 사용자의 Local Settings \ Application Data 폴더 아래 폴더로 추출하지만 런타임시 해당 위치를 this.GetType().Assembly.Location을 사용하여 가져올 수 있습니다.

라이브러리에는 .config 파일에서 참조되는 CustomConfigSection이라는 클래스가 있습니다.

도서관은 ConfigurationManager.OpenMappedExeConfiguration()을 사용 (사용자의 응용 프로그램 데이터 폴더에 저장)을 .config 파일에서 읽고 CustomConfigSection을 반환하는 방법 LoadConfigSection()와 클래스가 - 또는 그것은해야한다. 무슨 일이 발생 GetSection()CustomConfigSection을 포함하는 어셈블리를 찾을 수 없다는 말은 지저분한 ConfigurationErrorsException을 throw합니다.

성가신 일은 이틀 전에 효과가 있었다는 것입니다. 나는 Windows Update가 이것을 망쳤다고 생각한다. 나는 돌아가서 내가 잘 알고있는 코드의 이전 버전을 사용해 보았지만 아무 소용이 없었다. 환경에서 뭔가 바뀌 었습니다. 코드에서가 아니라 다른 머신에서도 발생했기 때문에 나만이 아닙니다!

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
     <section name="customConfigSection" type="TestExeConfigurationFileMapAddin.CustomConfigSection, TestExeConfigurationFileMapAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
    </configSections> 
    <customConfigSection> 
     <customConfigCollection> 
      <customConfig name="asdf" /> 
      <customConfig name="1234" /> 
      <customConfig name="jlkjjkljj" /> 
     </customConfigCollection> 
    </customConfigSection> 
</configuration> 

그리고 나는 (내가 언급 한 바와 같이 완벽하게 1 일 전 근무하는) 읽어 사용하고있는 코드 :

private CustomConfigSection LoadConfigSection() 
    { 
     ExeConfigurationFileMap configFileMap = new ExeConfigurationFileMap(); 
     configFileMap.ExeConfigFilename = m_userConfigFilePath; 
     Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None); 
     CustomConfigSection configSection = config.GetSection("customConfigSection") as CustomConfigSection; 
     return configSection; 
    } 

m_userConfigFilePath가 여기있다

는 예제의 .config 파일입니다 .config 파일의 올바른 경로이며 Configuration 개체의 HasFile 속성이 true입니다.

System.Configuration.ConfigurationErrorsException: An error occurred creating the configuration section handler for customConfigSection: Could not load file or assembly 'TestExeConfigurationFileMapAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. (C:\Documents and Settings\...\Application Data\TestExeConfigurationFileMapAddin\test.config line 4) ---> System.IO.FileNotFoundException: Could not load file or assembly 'TestExeConfigurationFileMapAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified. 
File name: 'TestExeConfigurationFileMapAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' 
    at System.Configuration.TypeUtil.GetTypeWithReflectionPermission(IInternalConfigHost host, String typeString, Boolean throwOnError) 
    at System.Configuration.MgmtConfigurationRecord.CreateSectionFactory(FactoryRecord factoryRecord) 
    at System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(String configKey, Boolean& isRootDeclaredHere) 

Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 
Running under executable C:\Program Files\ArcGIS\Desktop10.0\Bin\ArcMap.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = ... 
LOG: DisplayName = TestExeConfigurationFileMapAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
(Fully-specified) 
LOG: Appbase = file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/ 
LOG: Initial PrivatePath = NULL 
Calling assembly : System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Program Files\ArcGIS\Desktop10.0\Bin\ArcMap.exe.Config 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin/TestExeConfigurationFileMapAddin.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin.EXE. 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin/TestExeConfigurationFileMapAddin.EXE. 

    --- End of inner exception stack trace --- 
    at System.Configuration.BaseConfigurationRecord.FindAndEnsureFactoryRecord(String configKey, Boolean& isRootDeclaredHere) 
    at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boolean requestIsHere, Object& result, Object& resultRuntimeObject) 
    at System.Configuration.BaseConfigurationRecord.GetSection(String configKey, Boolean getLkg, Boolean checkPermission) 
    at System.Configuration.Configuration.GetSection(String sectionName) 
    at TestExeConfigurationFileMapAddin.Form1.LoadConfigSection() in C:\CSProjects\TestExeConfigurationFileMapAddin\TestExeConfigurationFileMapAddin\Form1.cs:line 46 
    at TestExeConfigurationFileMapAddin.Form1.LoadConfig() in C:\CSProjects\TestExeConfigurationFileMapAddin\TestExeConfigurationFileMapAddin\Form1.cs:line 28 

그리고 퓨전 자체 로그 바인딩 실패 : 여기

바인딩 로깅 Fusion 어셈블리를 활성화 한 후, 내가 오류입니다 분명 ConfigurationManager이 들어있는 어셈블리를 찾고

*** Assembly Binder Log Entry (7/29/2011 @ 12:46:02 PM) *** 

The operation failed. 
Bind result: hr = 0x80070002. The system cannot find the file specified. 

Assembly manager loaded from: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll 
Running under executable C:\Program Files\ArcGIS\Desktop10.0\Bin\ArcMap.exe 
--- A detailed error log follows. 

=== Pre-bind state information === 
LOG: User = ... 
LOG: DisplayName = TestExeConfigurationFileMapAddin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
(Fully-specified) 
LOG: Appbase = file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/ 
LOG: Initial PrivatePath = NULL 
LOG: Dynamic Base = NULL 
LOG: Cache Base = NULL 
LOG: AppName = NULL 
Calling assembly : System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\Program Files\ArcGIS\Desktop10.0\Bin\ArcMap.exe.Config 
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config. 
LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin/TestExeConfigurationFileMapAddin.DLL. 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin.EXE. 
LOG: Attempting download of new URL file:///C:/Program Files/ArcGIS/Desktop10.0/Bin/TestExeConfigurationFileMapAddin/TestExeConfigurationFileMapAddin.EXE. 
LOG: All probing URLs attempted and failed. 

을 내 CustomConfigSection 잘못된 위치에서 - 왜 최근에 이런 일이 일어나기 시작했는지 모르겠지만 2-3 일전에 여러 Windows Update를 설치했습니다. Windows XP Pro SP3 32 비트를 실행 중입니다.

이러한 모든 용어의 의미를 완전히 이해하지 않고서는 Fusion 로그에서로드 컨텍스트 나 정책을 변경하여 올바른 위치에서 어셈블리를로드하도록 할 수 있다는 희망을 갖게되었습니다. 그게 사실인가요? 그렇다면 어떻게됩니까?

+0

최근에 변경된 Windows 계정 권한이 있습니까?dll이 문서 및 설정 영역에있는 것처럼 바보 같은 질문이 들리 겠지만, 나는 최근에 내 문서 및 설정의 소유자가 아님을 발견했습니다 (Win7). – tomfumb

+0

아는 한, 아니오, 저는 여전히 시스템 관리자. – blah238

+0

글쎄, 전 관리 권한을 가지고 있다는 것을 알고있는 Win7 x64 머신에서 똑같은 것을 얻고있다. [this post] (http://www.codeproject.com/KB/dotnet/mysteriesofconfiguration)에 따르면. aspx? msg = 3307466 # xx3307466xx) Jon Rista의 2009 년부터, 이것이 작동하는 방법입니다. .NET의 보안 제한 때문에 어셈블리가 호스팅 응용 프로그램의 개인 bin 검색 경로에 있어야합니다. 이전에 작동하고 더 이상 추측 할 수없는 이유는 사실이지만, 사실이라면 Windows 업데이트가 보안을 강화한 것 같습니다. 추가 기능과 동일한 것을 발견하면 알려주십시오. – blah238

답변

3

Assembly.LoadFrom()을 사용하고 AssemblyResolve 이벤트를 처리하는 것이 핵심이었습니다. this answer의 코드 예가 ​​나를 위해 문제를 해결했습니다. 어떻게 작동하는지 전문가의 의견을 듣고 싶습니다.