관리되지 않는 DLL이 ASP.NET 서버에 로드되지 않음
이 질문은 원래 VS 2005에서 개발되었으며 현재 VS 2008에서 개발된 ASP.NET 웹 사이트와 관련이 있습니다.
이 웹사이트는 .NET이 아닌 두 개의 관리되지 않는 외부 DLL을 사용하며 저는 이 DLL을 컴파일할 소스 코드가 없으므로 그대로 사용해야 합니다.
이 웹 사이트는 Visual Studio 내에서 정상적으로 실행되며 이러한 외부 DLL을 찾아서 올바르게 액세스합니다.그러나 웹 사이트가 개발 PC가 아닌 웹 서버(IIS6 및 ASP.NET 2.0 실행)에 게시되면 이러한 외부 DLL을 찾아 액세스할 수 없으며 다음 오류가 발생합니다.
Unable to load DLL 'XYZ.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)
외부 DLL은 해당 DLL을 래핑하는 관리되는 DLL 및 웹 사이트의 다른 모든 DLL과 함께 웹 사이트의 bin 디렉토리에 있습니다.
이 문제를 검색하면 다른 많은 사용자가 외부 non에 액세스하는 데 동일한 문제가 있는 것 같습니다.ASP.NET 웹 사이트의 NET DLL이지만 작동하는 솔루션을 찾지 못했습니다.
다음을 시도해 보았습니다.
- 종속성을 확인하여 처음 세 개는 경로의 System32 디렉토리에 있고 마지막 세 개는 .NET 2 프레임워크에 있습니다.
- 두 DLL과 종속성을 System32에 넣고 서버를 재부팅했지만 웹사이트는 여전히 이러한 외부 DLL을 로드할 수 없었습니다.
- 웹 사이트 bin 디렉토리에 ASPNET, IIS_WPG 및 IUSR(해당 서버용)에 대한 모든 권한을 부여하고 재부팅했지만 웹 사이트는 여전히 이러한 외부 DLL을 로드할 수 없습니다.
- 외부 DLL을 기존 항목으로 프로젝트에 추가하고 "출력에 복사" 속성을 "항상 복사"로 설정했지만 웹 사이트에서 여전히 DLL을 찾을 수 없습니다.
- 또한 "Build Action" 속성을 "Embedded resource"로 설정해도 웹 사이트에서 DLL을 찾을 수 없습니다.
이 문제에 대한 어떠한 도움도 매우 감사할 것입니다!
이 문제는 관리되는 dll이 .NET Framework 디렉토리 아래의 임시 위치에 섀도 복사되기 때문에 발생합니다.자세한 내용은 http://msdn.microsoft.com/en-us/library/ms366723.aspx 을 참조하십시오.
관리되지 않는 dll은 복사되지 않으며 ASP.NET 프로세스는 로드해야 할 때 해당 dll을 찾을 수 없습니다.
관리되지 않는 dll을 시스템 경로에 있는 디렉터리(명령줄에 "path"를 입력하여 시스템의 경로를 확인)에 저장하여 ASP.NET 프로세스에서 찾을 수 있도록 하는 것이 쉬운 해결 방법입니다.System32 디렉토리는 항상 경로에 있으므로 관리되지 않는 dll을 항상 배치하면 되지만, 시스템32 디렉토리가 오염되지 않도록 경로에 다른 폴더를 추가한 다음 dll을 추가하는 것이 좋습니다.이 방법의 한 가지 큰 단점은 모든 버전의 응용 프로그램에 대해 관리되지 않는 dll의 이름을 변경해야 하며 자신만의 dll 지옥을 빠르게 가질 수 있다는 것입니다.
이미 경로에 있는 폴더(예: system32)에 dll을 넣는 대신 다음 코드를 사용하여 프로세스의 경로 값을 변경할 수 있습니다.
System.Environment.SetEnvironmentVariable("Path", searchPath + ";" + oldPath)
그런 다음 LoadLibrary가 관리되지 않는 DLL을 찾으려고 하면 searchPath도 검색합니다.이것은 System32 또는 다른 폴더를 엉망으로 만드는 것보다 더 나을 수 있습니다.
\System32\에 dll을 넣어 봅니다.Inetsrv 디렉터리.이 디렉터리는 윈도우즈 서버의 IIS에 대한 작업 디렉터리입니다.
이것이 작동하지 않으면 System32 디렉토리에 dll을 넣고 Inetsrv 디렉토리에 종속성 파일을 넣어 보십시오.
Matt의 답변에 덧붙여, 이것이 64비트 서버 2003 / IIS 6에서 마침내 제게 도움이 된 것입니다.
- dlls / asp.net 이 동일한 버전인지 확인합니다(32/64비트).
- inetsrvdir에 관리되지 않는 dll을 배치합니다(64비트 창에서는 syswow64 아래에 있습니다(sys32/inetsrv 디렉토리가 생성되더라도).
- 관리되는 dll을 /bin에 남깁니다.
- 두 dll 집합 모두에 읽기/실행 권한이 있는지 확인합니다.
FileMon 또는 ProcMon을 사용하여 문제가 있는 DLL의 이름을 필터링합니다.DLL을 검색할 때 검색되는 디렉터리와 사용자가 가질 수 있는 권한 문제가 표시됩니다.
다른 옵션은 기본 DLL을 관리되는 DLL에 리소스로 포함하는 것입니다.ASP.NET에서는 런타임에 임시 폴더에 기록해야 하므로 이 작업이 더 복잡합니다.이 기법은 다른 SO 답변에 설명되어 있습니다.
환경 설정에서도 항상 경로 변수를 확인할 수 있습니다.
저는 같은 문제를 접했습니다.그리고 위의 모든 옵션을 시도해 보았습니다. system32로의 복사, inetpub, 경로 환경 설정 등 아무 것도 작동하지 않았습니다.관리되지 않는 dll을 웹 응용 프로그램 또는 웹 서비스의 bin 디렉터리에 복사하여 이 문제를 최종적으로 해결합니다.
◦이 문제로 하루 종일 고심한 끝에 마침내 저에게 맞는 해결책을 찾았습니다.테스트일 뿐이지만, 방법은 효과가 있습니다.
namespace TestDetNet
{
static class NativeMethods
{
[DllImport("kernel32.dll")]
public static extern IntPtr LoadLibrary(string dllToLoad);
[DllImport("kernel32.dll")]
public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
[DllImport("kernel32.dll")]
public static extern bool FreeLibrary(IntPtr hModule);
}
public partial class _Default : System.Web.UI.Page
{
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
private delegate int GetRandom();
protected System.Web.UI.WebControls.Label Label1;
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text = "Hell'ou";
Label1.Font.Italic = true;
}
protected void Button1_Click(object sender, EventArgs e)
{
if (File.Exists(System.Web.HttpContext.Current.Server.MapPath("html/bin")+"\\DelphiLibrary.dll")) {
IntPtr pDll = NativeMethods.LoadLibrary(System.Web.HttpContext.Current.Server.MapPath("html/bin")+"\\DelphiLibrary.dll");
if (pDll == IntPtr.Zero) { Label1.Text = "pDll is zero"; }
else
{
IntPtr pAddressOfFunctionToCall = NativeMethods.GetProcAddress(pDll, "GetRandom");
if (pAddressOfFunctionToCall == IntPtr.Zero) { Label1.Text += "IntPtr is zero"; }
else
{
GetRandom _getRandom = (GetRandom)Marshal.GetDelegateForFunctionPointer(pAddressOfFunctionToCall,typeof(GetRandom));
int theResult = _getRandom();
bool result = NativeMethods.FreeLibrary(pDll);
Label1.Text = theResult.ToString();
}
}
}
}
}
}
실행은 배포한 위치에서 XYZ.dll에 직접 의존합니다.누락된 내용이 나타나지 않으면 플랫폼 SDK의 fuslogvw 도구를 사용하여 로더 오류를 추적합니다.또한 이벤트 로그에는 DLL 로드 실패에 대한 정보가 포함되어 있는 경우도 있습니다.
Application_start에서 다음을 사용합니다(필요에 따라 /bin/x64 및 bin/dll/x64 폴더를 사용자 지정).
String _path = String.Concat(System.Environment.GetEnvironmentVariable("PATH")
,";"
, System.Web.Hosting.HostingEnvironment.MapPath("~/bin/x64")
,";"
, System.Web.Hosting.HostingEnvironment.MapPath("~/bin/dll/x64")
,";"
);
System.Environment.SetEnvironmentVariable("PATH", _path, EnvironmentVariableTarget.Process);
Windows/Sys에 DLL을 넣어 봅니다.WOW64 폴더.그것은 나에게 유일하게 효과가 있었습니다.
언급URL : https://stackoverflow.com/questions/344608/unmanaged-dlls-fail-to-load-on-asp-net-server
'programing' 카테고리의 다른 글
| Possible to create Oracle Database object types inside of PL/SQL? (0) | 2023.06.18 |
|---|---|
| 유형 스크립트: 인터페이스의 상수 (0) | 2023.06.18 |
| 유형 스크립트의 다른 파일에서 함수를 선언하려면 어떻게 해야 합니까? (0) | 2023.06.18 |
| Java Apache POI를 사용하여 Excel에 행 삽입 (0) | 2023.06.18 |
| Python의 기본 인코딩을 변경하시겠습니까? (0) | 2023.06.18 |