2012-05-18 2 views
3

.NET 4.0으로 작성된 응용 프로그램에서 네이티브 DLL (C로 작성)을 메모리에로드해야합니다.비 관리 DLL을 스트림에서로드하는 방법은 무엇입니까?

현재 DLL이있는 경로를 전달하는 LoadLibrary에 P/Invoke 호출을 사용하고 있습니다.

이 작동하지만이 DLL은 DB에서 제공되기 때문에 스트림을 통해로드 할 수 있는지, 파일 시스템의 어딘가에 DLL을 저장할 필요가 없는지 알고 싶습니다.

+0

이론적으로는 할 수 있습니다 NET에서 재작 성합니다. https://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/ –

답변

2

Windows에서 허용하지 않는 경우 항상 네이티브 코드를 디스크의 파일에서로드해야합니다. 이것은 운영 체제가 설계된 방식의 핵심이며 실행 파일은 메모리 매핑 파일을 통해 메모리에 매핑됩니다. 어떤 파일이 필요합니다. 방지하려면 디베이스에서 DLL을 저장, 당신은 일반적으로 UAC 하나 때문에 디스크에 쓸 수 없습니다 만 IL 데이터가 아닌 네이티브 코드이기 때문이다.

그것은 순수 관리 코드에 대한 작업 (Assembly.Load (바이트 []) 또는 바이러스 스캐너 나 IT 직원이 아무데도 나타나지 않는 실행 파일에 대해 상당히 불만을 나타냅니다. 사용자의 컴퓨터에서 작동하지만 사용자 컴퓨터에서 확률이 매우 낮습니다.

+0

응용 프로그램은 매우 복잡하며 특정 환경에서 작동하도록 설계되었습니다. 정보를 가져 주셔서 감사합니다, 나는 파일 시스템으로 추출을 진행할 것입니다. – Drake

+0

이것은 거짓입니다. 메모리에서 DLL을로드 할 수 있으며 수동 매핑이라고합니다. –

+0

펠릭스, 어떻게 설명 할 수 있니? – ygoe

0

PInvoke 특성 사용에 파일 이름을 지정했기 때문에 불가능합니다. PInvoke에는 정적으로 알려진 파일 이름이 필요합니다.

정적으로 파일 이름을 결정할 수 없으면 LoadLibrary 및 GetProcAddress를 사용하여 dll에 포함 된 함수를 호출해야 할 수 있습니다.

또는 반사 방출을 사용하여 PInvoke 기능을 동적으로 방출 할 수 있습니다.

+0

스트림에서 메모리에 DLL을로드하는 데 사용할 수있는 LoadLibrary 이외의 다른 API가 존재합니까? ? – Drake

+0

아니요 그러한 API가 존재합니다. 많은 Windows API와 커널 역시로드 된 라이브러리가 메모리 매핑 파일을 기반으로 할 것으로 기대합니다. – usr

관련 문제