2017-09-08 12 views
3

ess.exe이라는 실행 파일이 있습니다. sgen.exe을 사용하여 XmlSerializer DLL을 생성하고 실행할 때 생성 된 ess.XmlSerializers.dll을 선택하면 모두 정상입니다.EXE가 아닌 DLL에 대해 sgen 생성 XmlSerializer DLL을 선택하는 방법은 무엇입니까?

Assembly.LoadFrom(DllPathname)을 사용하여 동적으로로드되는 EntrianSourceSearch_14.dll이라는 DLL도 있습니다. 해당 DLL에 대해 XmlSerializer DLL을 생성하는 경우 은 생성 된 DLL을이 아닙니다. 대신 XML 직렬화 코드의 런타임 생성으로 돌아갑니다.

DLL에서 해당 생성 된 XmlSerializer DLL을 가져 오려면 어떻게해야합니까?

편집 : 내 DLL이 Visual Studio 확장 프로그램의 일부이기 때문에 XmlSerializer DLL을 실행 파일의 디렉터리에 넣을 수 없습니다. 실행 파일은 Visual Studio (devenv.exe)이며 내 제품을 해당 디렉터리에 복사하면됩니다. 아마 반 사회적으로 보일 수 있습니다. :-)

추가 컨텍스트를 추가하려면 편집 : Visual Studio 추가 기능 확장입니다. 2005 년부터 2017 년까지 모든 Visual Studio 버전에서 작동합니다. 대부분의 코드는 Program Files에 설치되며 이전 버전의 Visual Studio에서는 추가 기능으로로드합니다. 추가 기능을 지원하지 않는 최신 버전의 Visual Studio에는 Program Files의 주요 구성 요소에 대한 로더 인 확장 프로그램이 있습니다. 이 확장 프로그램에서는 LoadFrom을 사용하여 해당 주 구성 요소를로드합니다. 그 중 하나는 EntrianSourceSearch_14.dll입니다. 이미 구축하고 서명 된 직렬화 어셈블리를 배포하는 경우 당신은로드하고 시리얼을 캐시 동안

+0

당신은 어셈블리를로드하는 코드의 조각을 볼 수 Project 참조를 추가 [this post] (https://stackoverflow.com/a/3798614/17034). Assembly.Load()에 대한 호출에 주목하자. LoadFrom()이 수행 한 디렉터리를 찾지 않을 것이다. Fuslogvw.exe로 확인할 수 있습니다. xmlserializers.dll 어셈블리를 exe와 같은 디렉터리로 이동하는 것이 좋습니다. –

+0

@HansPassant : 설명 및 어셈블리 로딩 코드에 대한 링크를 보내 주셔서 감사합니다. "xmlserializers.dll 어셈블리를 exe와 같은 디렉터리로 이동"과 관련하여 DLL은 Visual Studio 확장의 일부이므로 실행 파일은 Visual Studio (devenv.exe)입니다. 내 제품을 디렉토리에 복사하면 반 사회적으로 보일 수 있습니다! – RichieHindle

+0

그와 같은 중요한 세부 사항은 질문이 아닌 주석에 속합니다. 최대한 많은 문맥 정보를 추가하십시오. 그럼 좀 더. –

답변

2

, 당신은 CurrentlDomain.AssemblyResolve 처리기를 추가 할 수 있습니다, 뭔가 같은 : 그러나

private Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var codeBase = new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath; 
     var serializerPath = Path.Combine(Path.GetDirectoryName(codeBase), new AssemblyName(args.Name).Name + ".dll"); 
     if (File.Exists(serializerPath)) 
      return Assembly.LoadFrom(serializerPath); 
     else 
      return null; 
    } 

, 내가 할 수있는 쉬운 방법을 찾을 수 없습니다 단일 어셈블리 VS 확장에 직렬화 어셈블리 배포를 포함하십시오.

내가 선호하는 대체 방법을 찾았습니다.

  • 이동이 어셈블리에 대해 별도의 조립
  • 에 XML을 직렬화를 사용하는 코드 :
  • 는 확장 패키지에서 기본 직렬화 어셈블리에 Browse.. 참조를 추가 확장 패키지에서 위의 어셈블리에
+0

이 코드는 아름답게 작동합니다 ('+ ". dll"'이 추가되었습니다) - 많은 감사합니다! 한 가지 질문이 있습니다. "서명 된 ** 직렬화 어셈블리를 이미 구축하고 배포 한 경우"어셈블리에 서명하는 것이 효과가있는 이유는 무엇입니까? 그것은 모두없이 작동하는 것 ... – RichieHindle

+0

그 버그를 편집했습니다 :). VS 15를 사용하면 SGEN 어셈블리에 서명하지 않았을 때 "강하게 명명 된 어셈블리가 필요합니다"라는 메시지가 나타납니다. 빌드 프로세스가 자동으로 SGEN 어셈블리에 서명 할 것입니다. –

+0

현재 sgen을 수동으로 실행하여 어셈블리를 생성 중이므로 명시 적 서명은 진행되지 않습니다. 걱정하지 마세요. 어쨌든 언제든지 서명 할 수 있습니다. (만약 당신이 신경 쓰지 않는다면 어떻게 강하게 이름 붙여진 어셈블리가 필요할까요? "라는 에러가 나타나면 Assembly.LoadFrom()이나 다른 것에서 예외가 발생합니다. – RichieHindle