2014-04-15 1 views
1

관리되지 않는 C++ 라이브러리에 액세스하는 데 관리되는 C# 래퍼를 사용하고 있습니다. 도서관은 내가 필요로하는 시간을 소비하는 계산법 (최대 6 초)을한다. 또한 이와 병행하여 빠르게 얻을 수있는 데이터가 계속 필요합니다.같은 DLL을 참조하는 비 관리 코드 래퍼 여러 인스턴스

달성하기 위해 래퍼 인스턴스 두 개를 얻으려고했습니다. 하나는 빠른 요소 용이고 다른 하나는 병렬 스레드로 시간 소모적 인 정보를 계산합니다. 하지만, 느린 분석기를 설치하자마자, 빠른 분석기조차도 느려집니다.

fullAnalyzer = new Analyzer(FullAnalysis); 
miniAnalyzer = new Analyzer(MinimalAnalysis); 

빠른 구성을 먼저 구현하면 둘 다 동일한 구성을 공유하는 것처럼 보입니다. 즉, 여전히 빠릅니다.

간섭없이 관리되지 않는 라이브러리에 액세스하는 래퍼의 별도 인스턴스가 두 개 이상있을 수 있습니까? 나는 그렇게 - 어떻게 끝났어? 아니면이 동작은이 라이브러리의 로컬 것입니까?

편집 :이 생성자와 래퍼가, 내가 말할 수있는 것과 잘 보이는

public class ScrWrapper 
{ 
    private const string DllName = @"Analyzer.dll"; 

    public bool IsConfigLoaded { get; private set; } 
    public bool IsAnalyticsSuccessful { get; private set; } 

    public Analyzer() 
    { 
     IsConfigLoaded = false; 
     IsAnalyticsSuccessful = false; 
    } 

    public Analyzer(string configFileName, ScrProcLevel procLevel = ScrProcLevel.PL_NONE) 
    { 
     IsConfigLoaded = false; 
     IsAnalyticsSuccessful = false; 
     LoadConfig(configFileName, procLevel); 
    } 

    public void LoadConfig(string configFileName, ProcLevel procLevel = ScrProcLevel.PL_NONE) 
    { 
     if (configFileName.Length < 1) 
      throw new ArgumentException("Empty configFileName. Must contain valid file name."); 

     if (!System.IO.File.Exists(configFileName)) 
      throw new ArgumentException(String.Format("Invalid configFileName. File not found: {0}",configFileName)); 

     if (!System.IO.File.Exists(DllName)) 
      throw new ArgumentException(String.Format("Invalid DllName. File not found: {0}", DllName)); 

     bool b_config_status = false; 
     try 
     { 
      StringBuilder sb = new StringBuilder(configFileName); 
      ScanAuto_EnableWriteOut(true); 
      b_config_status = ScanAuto_LoadConfig(sb); 
     } 
     catch (Exception ex) 
     { 
      throw new ScrException("ERROR: Unmanaged Analyzer threw exception.", ex); 
     } 
     if (!b_config_status) 
     { 
      throw new ScrException(String.Format("ERROR: Failed to load the configurationfile, b_config_status=false")); 
     } 

     IsConfigLoaded = b_config_status; 

     _ProcLevel = procLevel; 
     Analyzer_SetProcLevel(_ProcLevel); 
    }  
...  


    [DllImport(DllName, CallingConvention = CallConvention)] 
    [return: MarshalAs(UnmanagedType.I1)] 
    private extern static bool ScanAuto_LoadConfig(StringBuilder _pConfigFName); 

} 
+0

을 참조하십시오. 인스턴스를 생성하는 방식은 내가 볼 수있는 작은 부분부터 잘 수행해야하므로 문제가 래퍼 또는 관리되지 않는 dll에 있어야합니다. 라이브러리에 대한 코드가 없을 수도 있지만 래퍼 코드를 게시하여 배제 할 수 있습니까? – ajg

+0

답변 해 주셔서 감사합니다. 래퍼 코드에서 관련 부분을 추가했습니다. – DIF

+0

나는 DllImport 비트를 물어 보려하고 있었고 추가했습니다! 래퍼는 내가 말할 수있는 것으로부터 멋지게 보이므로 ScanAuto_LoadConfig 메서드 (및 아마도 초기화하는 멤버)가 정적이므로 매번 같은 비트의 구성을 덮어 쓰게됩니다. http://msdn.microsoft.com/en-us/library/b1b5y48f.aspx – ajg

답변

1

래퍼 코드의 일부이다 ScanAuto_LoadConfig 방법 (따라서 구성원이 초기화 중 있다는 그 사실 때문에) 정적입니다, 매번 동일한 비트의 설정을 덮어 씁니다. Static Data Members (C++)

관련 문제