2013-06-27 1 views
2

WCF 서비스의 ASP.NET 호스트에서 작업하고 있습니다. 이 서비스는 자체적으로 비 관리 DLL을 참조하는 C++/CLI 래퍼 라이브러리를 참조합니다. this question을 기반으로 ASP.NET DLL에 관리되지 않는 DLL을 포함했습니다. 나는 다음과 같이 압축을 풉니 다 : 나는 App_Code 폴더에 Global.asax.csAppInitialize()Application_Start()이 코드를 넣어 시도했습니다임베디드 된 비 관리 DLL이 ASP.NET에로드되지 않습니다.

string[] dlls = new [] { "myDLL.dll", "myDLLD.dll" }; 
Assembly assembly = Assembly.GetExecutingAssembly(); 
string location = Path.GetDirectoryName(assembly.Location); 
Dictionary<string, Stream> streams = 
    (from dll in dlls 
    select new KeyValuePair<string, Stream>(
     dll, assembly.GetManifestResourceStream(typeof(Global), dll))) 
    .ToDictionary(p => p.Key, p => p.Value); 

foreach (KeyValuePair<string, Stream> stream in streams) 
{ 
    using (FileStream file = new FileStream(Path.Combine(location, stream.Key), 
              FileMode.Create)) 
    { 
     stream.Value.CopyTo(file); 
    } 
} 

하지만 두 경우 모두 내가 대해 죽음의 노란색 화면을 얼마나 래퍼 DLL 또는 종속성 중 하나를 앞에로드 할 수 없습니다. 중 하나에서 중단 점이 발생했습니다. 내가 브레이크 포인트에 도달 할 수있는 유일한 방법은 시스템 경로 (예 : C:\Windows\system)의 어딘가에 관리되지 않는 DLL을 배치하는 것이지만, 이는 분명히 DLL을 임베딩하는 목적을 처음부터 무의미하게 만듭니다. 어떻게 ASP를 찾고 시작하기 전에 DLL이 있어야합니까?

+2

아마도 관리되지 않는 DLL을 참조하는 관리 DLL도 포함되어야합니다. ASP.NET은 주문형 연결을하지 않습니다 :'bin'에있는 어떤 것이라도 "지금 당장"로드 및 연결을 시도합니다. – Medinoc

답변

2

분명히 ASP.NET의 열망있는로드 메커니즘이 문제였습니다. 관리되는 래퍼가 출력 디렉터리에 복사 되었기 때문에 ASP가 아직 찾지 못했지만 시작시 관리되지 않는 DLL에 연결하려고 시도했습니다. 이 문제를 해결하기 위해 C++/CLI DLL에 /DELAYLOAD 링커 옵션을 사용하고 위에 표시된 임베디드 DLL 추출과 조합하여 Application_Start()LoadLibrary() P/Invoke를 사용했습니다.