>백엔드 개발 >C++ >관리되는 C# DLL 내에 관리되지 않는 DLL을 어떻게 포함할 수 있나요?

관리되는 C# DLL 내에 관리되지 않는 DLL을 어떻게 포함할 수 있나요?

Susan Sarandon
Susan Sarandon원래의
2024-12-31 21:43:10950검색

How Can I Embed an Unmanaged DLL within a Managed C# DLL?

관리되지 않는 DLL을 관리되는 C# DLL에 포함

문제:

관리되는 DLL 내에 관리되지 않는 C DLL을 어떻게 포함할 수 있습니까? C# DLL을 사용하여 DLLImport?

답변:

관리되지 않는 DLL을 관리되는 DLL에 포함하는 것은 일반적으로 권장되지 않지만 초기화 중에 관리되지 않는 DLL을 임시 디렉토리에 추출하고 사용하기 전에 LoadLibrary를 사용하여 명시적으로 로드 P/Invoke.

구현:

  1. 관리되지 않는 DLL 추출: 다음을 사용하여 관리되지 않는 DLL을 저장할 임시 디렉터리를 결정합니다. 버전 충돌을 방지하려면 어셈블리 버전 번호를 사용하세요. DLL이 포함된 포함된 리소스 스트림을 이 디렉터리에 추출합니다.
  2. DLL 로드: LoadLibrary를 사용하여 추출된 DLL을 명시적으로 로드합니다. 임시 디렉터리는 시스템 경로에 없을 수 있으므로 P/Invoke 지시문이 DLL을 찾는 데 필요합니다.

예제 코드:

// Get temporary directory with assembly version in path
string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version);
Directory.CreateDirectory(dirName);
string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll");

// Get embedded resource stream and copy DLL to temporary file
using (Stream stm = Assembly.GetExecutingAssembly().GetManifestResourceStream("MyAssembly.Properties.MyAssembly.Unmanaged.dll"))
{
    using (Stream outFile = File.Create(dllPath))
    {
        const int sz = 4096;
        byte[] buf = new byte[sz];
        while (true)
        {
            int nRead = stm.Read(buf, 0, sz);
            if (nRead < 1)
                break;
            outFile.Write(buf, 0, nRead);
        }
    }
}

// Load DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);

이 접근 방식에는 모든 것을 단일 파일에 보관하는 등의 장점이 있지만 관리되지 않는 DLL을 별도의 파일로 어셈블리에 연결하는 것이 일반적으로 권장됩니다. 보안과 단순성을 모두 보장합니다.

위 내용은 관리되는 C# DLL 내에 관리되지 않는 DLL을 어떻게 포함할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.