>백엔드 개발 >C++ >관리되는 C# DLL에 관리되지 않는 DLL을 포함하고 '액세스가 거부되었습니다'를 방지하는 방법은 무엇입니까?

관리되는 C# DLL에 관리되지 않는 DLL을 포함하고 '액세스가 거부되었습니다'를 방지하는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-29 14:32:11864검색

How to Embed Unmanaged DLLs in Managed C# DLLs and Avoid

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

관리되지 않는 DLL을 관리되는 C# 코드와 통합할 때 개발자는 이러한 DLL을 관리되는 C# 코드에 포함해야 하는 경우가 종종 있습니다. 관리되는 어셈블리. 이 문서에서는 잠재적인 문제를 조사하고 관리되지 않는 DLL을 관리되는 DLL에 포함하기 위한 솔루션을 제공합니다.

문제 설명

개발자가 관리되는 C# 내에 관리되지 않는 DLL을 포함하려고 합니다. Microsoft에서 권장하는 대로 DllImport 특성을 사용하는 DLL입니다. 그러나 코드를 실행하면 "액세스가 거부되었습니다" 예외가 발생합니다.

해결 방법

MSDN 문서에서는 관리되지 않는 DLL을 포함할 수 있는 가능성을 제안하지만 실패합니다. DLL 액세스 권한과 관련된 근본적인 문제를 해결합니다. 다음 해결 방법은 이 문제를 효과적으로 해결합니다.

  1. 관리되지 않는 DLL 추출: 초기화 중에 포함된 리소스에서 관리되지 않는 DLL을 임시 디렉터리로 추출합니다.
  2. DLL을 명시적으로 로드: 추출 후 LoadLibrary 함수를 사용하여 DLL을 명시적으로 로드합니다. process.
  3. DllImport 활용: DLL이 로드되면 이를 참조하는 DllImport 지시문은 이미 로드된 버전을 활용합니다.

다음은 이 접근 방식의 구현 예입니다. :

// Extract the unmanaged DLL
string dirName = Path.Combine(Path.GetTempPath(), "MyAssembly." + Assembly.GetExecutingAssembly().GetName().Version.ToString());
if (!Directory.Exists(dirName))
  Directory.CreateDirectory(dirName);
string dllPath = Path.Combine(dirName, "MyAssembly.Unmanaged.dll");
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 the DLL explicitly
IntPtr h = LoadLibrary(dllPath);
Debug.Assert(h != IntPtr.Zero, "Unable to load library " + dllPath);

다음 단계를 따르면 개발자는 성공적으로 임베드할 수 있습니다. 관리되지 않는 DLL을 관리되는 C# DLL로 변환하여 "액세스가 거부되었습니다" 예외를 극복하고 이 통합 기술의 잠재력을 최대한 활용합니다.

위 내용은 관리되는 C# DLL에 관리되지 않는 DLL을 포함하고 '액세스가 거부되었습니다'를 방지하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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