2012-10-28 5 views
0

의 누락 된 어셈블리 처리 C#으로 어셈블리를 동적으로로드하려면 http://support.microsoft.com/kb/837908의 방법 3을 따르고 있습니다. 그러나 코드가 나를 위해 작동하지 않습니다. 코드의 다음 섹션에서 누락 된 어셈블리의 이름이 응용 프로그램에서 참조하는 어셈블리 중 하나 인 경우에만 작성자가 누락 된 어셈블리를로드합니다.assemblyresolve를 사용하여 C#

디버그에서이 함수를 호출하면 함수가 호출되지만 누락 된 어셈블리는 참조 된 어셈블리에 없으므로 여기서는 설정되지 않습니다. 어떤 아이디어가 왜 발생합니까? 해당 DLL이 C# 또는 네이티브 C++인지 확실하지 않습니다. 이 방법으로 C++ dll을로드 할 수 없기 때문에 이것이 가능합니까? 그런 다음 누락 된 C++ 어셈블리에 대해이 함수가 호출되는 이유는 무엇입니까? 설명은 감사하겠습니다. 이것이 C#에서 참조하는 C++ 어셈블리에서 작동하지 않는다면 대체 방법은 무엇입니까?

+0

나는 그것을 다른 폴더에있는 것으로 알고있는 어셈블리 (dll)를로드하는 데 사용했습니다. 이미로드 된 어셈블리에 대한 참조를 반환하거나 새 dll을로드하고로드 된 어셈블리를 반환 할 수 있습니다. 왜 이미로드 된 어셈블리를 해결해야하는지 궁금합니다. – Casperah

+0

하지만 누락 된 어셈블리가 내 경우에 참조 된 어셈블리의 일부가 아닌 이유가 혼란 스럽습니다. CLR이 참조 된 어셈블리를로드하고 실패 할 때이 함수가 호출되기 때문입니다. 그렇다면 누락 된 어셈블리가 실행되는 어셈블리의 참조 된 어셈블리에없는 이유는 무엇입니까? – user236215

답변

1

"어셈블리"라는 용어는 모든 DLL을 의미하지는 않습니다. .NET 용으로 작성된 DLL을 의미합니다. 일반적으로 메모리 관리를 위해 기존 C++ 힙 대신 .NET 가비지 수집기를 사용한다는 것을 의미하는 "관리 코드"라고도합니다. (단순화 중이며, 관리되는 코드와 관리되지 않는 코드를 혼합하여 사용하더라도 이러한 방식으로 해결되는 "혼합 모드 어셈블리"가 있습니다. "관리되는"은 단순한 메모리 관리 이상의 의미입니다.)

It 참조 된 어셈블리가 C++/CLI 또는 C#로 작성되었는지 여부는 중요하지 않습니다. C++/CLI는 종종 C++과 혼동되지만 사실 관리 환경을 활용하는 데 추가 기능이있는 또 다른 언어입니다. /clr 스위치로 C++ 'ish를 컴파일하면 C++이 아닌 C++/CLI가됩니다.

이해해야하는 참조 된 KB 문서에는 세 가지 문제점이 있습니다. 기사에

  1. "방법 3"이 계정에 간접적으로 참조 된 어셈블리을지지 않습니다. 즉, 주 어셈블리에서 참조하는 어셈블리에서 참조 된 어셈블리입니다. 아마 지금 너를 물고있을거야. 심지어 경우 -

  2. 이 기사는 당신이 당신의 핸들러를 등록하거나 핸들러가 등록되기 전에 지터가 일부 어셈블리를 해결할 방법의 본문에 가능한 한 적은을 하는 것이 중요합니다 언급하지 그 일을 담당하는 코드 행은 동일한 메소드의 등록 아래에 있습니다. 이것은 JIT 컴파일이 실행에 선행되기 때문입니다.

  3. C++/CLI 코드를 처리하는 경우 이전 링크와 관련하여 관리되지 않는 C++ DLL을로드해야 할 가능성이 있습니다. 이는 기존의 Windows DLL 검색 순서와 리졸버 외부에서 수행됩니다. 그러나 이것은 특정 DLL에 대해 입력 된 처리기를 보는 한 문제가 아닙니다. 일반적으로 .NET과 아무 관련이없는 C 또는 C++ DLL은 처리기에서 전혀 볼 수 없습니다.

+0

설명해 주셔서 감사합니다. 매우 도움이됩니다. 질문 - 응용 프로그램과 함께 일부 어셈블리를 수동으로 어떻게 등록합니까? 나는이 응용 프로그램의 시작을 할 수 있으며 호출되는 이러한 이벤트를 피할 수 있습니다. 2) 포인트 3이 맞습니다.C++/CLR Dll은 기본 비 관리 Dll을 호출합니다. 그러나 이들은 regsvr32 utlity를 사용하여 등록됩니다. 등록되지 않았다면 DLLImport를 사용하여 등록해야합니다. – user236215

+0

@ user236215 - 1)'Assembly.LoadFrom','GetReferencedAssemblies'를 열거하고로드하십시오. 2)'regsvr32'는 DLL 파일을 "등록"하지 않고 DLL을 한 번만로드하고 DLL 자체가 의미하는대로 (일반적으로 COM 구성 요소) 자체를 등록 할 기회를줍니다. DLL이 COM 서버라면 괜찮습니다. 하지만 실제로는 관리 코드에서 참조하거나 DLL로로드하지 않습니다. 동일한 COM 구성 요소를 참조하고 있습니다. COM 배관이 그것에 연결하게하십시오; ComSysApp 서비스가 DLL을 다른 프로세스로로드 할 가능성이 있습니다. –

+0

예, 어셈블리를로드 할 수 있지만 등록이 필요합니다. 그렇지 않으면 런타임에서 이벤트를 호출합니다. – user236215