2017-12-13 25 views
1

ASP.NET 응용 프로그램에서 Microsoft.SqlServer.Types 라이브러리를 사용하고 있습니다. 라이브러리는 P/Invoke를 통해 LoadLibrary()으로로드해야하는 네이티브 DLL에 의존합니다.네이티브 DLL을 섀도 복사본 디렉터리에 수동으로 복사해도 안전합니까?

라이브러리 설명서에 Server.MapPath("~/bin")에서 네이티브 DLL을로드하라는 메시지가 표시되지만 네이티브 DLL이 잠겨 응용 프로그램이 새로 설치되지 않습니다.

따라서 메인 웹 사이트 DLL의 섀도 복사본 위치를 Assembly.GetExecutingAssembly().Location으로 검색하고, 네이티브 DLL을 그 위치에 복사 한 다음 거기에서로드하려고합니다.

안전하게 할 수 있습니까? 아니면 사용해야하는 안전한 방법이 있습니까?

답변

0

나는 이것을 구현했으며 잘 동작하는 것으로 보인다. 배포시 잠금 문제가 없습니다.

샘플 코드는 다음과 같습니다. 환경에 따라이 값을 수정해야 할 수도 있습니다.이 값은 OWIN에서 호스팅되는 Web API 2 용으로 작성되었습니다.

private void LoadSqlServerTypes() 
{ 
    var shadowCopyDirectoryPath = new FileInfo(Assembly.GetExecutingAssembly().Location).DirectoryName; 
    var nativeDllDirectory = new DirectoryInfo(HostingEnvironment.MapPath("~/bin/SqlServerTypes")); 
    var nativeDllShadowCopyDirectory = Path.Combine(shadowCopyDirectoryPath, "SqlServerTypes"); 
    if (Directory.Exists(nativeDllShadowCopyDirectory) == false) 
    { 
     nativeDllDirectory.CopyTo(nativeDllShadowCopyDirectory, true); 
    } 

    SqlServerTypes.Utilities.LoadNativeAssemblies(shadowCopyDirectoryPath); 
} 

CopyTo 방법 https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-copy-directories

public static partial class DirectoryInfoExtensions 
{ 
    /* 
    * Source adapted from https://docs.microsoft.com/en-us/dotnet/standard/io/how-to-copy-directories 
    */ 
    /// <summary> 
    /// Copy a directory and its contents to a specified location. 
    /// </summary> 
    /// <param name="sourceDirectory">The directory to copy.</param> 
    /// <param name="destinationDirectoryPath">The path of the new directory to create.</param> 
    /// <param name="recursive">True if subdirectories must be copied; otherwise, false.</param> 
    public static void CopyTo(this DirectoryInfo sourceDirectory, string destinationDirectoryPath, bool recursive) 
    { 
     if (Directory.Exists(destinationDirectoryPath) == false) 
     { 
      Directory.CreateDirectory(destinationDirectoryPath); 
     } 

     var files = sourceDirectory.GetFiles(); 
     foreach (var file in files) 
     { 
      string destinationFilePath = Path.Combine(destinationDirectoryPath, file.Name); 
      file.CopyTo(destinationFilePath, false); 
     } 

     if (recursive == true) 
     { 
      var subdirectories = sourceDirectory.GetDirectories(); 
      foreach (DirectoryInfo directory in subdirectories) 
      { 
       string destinationSubdirectoryPath = Path.Combine(destinationDirectoryPath, directory.Name); 
       CopyTo(new DirectoryInfo(directory.FullName), destinationSubdirectoryPath, recursive); 
      } 
     } 
    } 
} 
에서 코드의 수정 된 버전 인