C# 引用同一dll的非托管代码的多个包装实例 我使用托管C语言包装器访问非托管C++库。图书馆做了一些我需要的耗时计算(最多6秒)。同时,我也需要一些快速获取的数据

C# 引用同一dll的非托管代码的多个包装实例 我使用托管C语言包装器访问非托管C++库。图书馆做了一些我需要的耗时计算(最多6秒)。同时,我也需要一些快速获取的数据,c#,c++,unmanaged,C#,C++,Unmanaged,为了实现这一点,我尝试获取包装器的两个实例,一个用于quick stuff,另一个在并行线程中用于计算耗时信息。但是,当我实例化其中一个速度慢的分析器时,即使是速度快的分析器也会变慢 fullAnalyzer = new Analyzer(FullAnalysis); miniAnalyzer = new Analyzer(MinimalAnalysis); 看起来它们在后面共享相同的配置,因为如果我先实例化快速的一个,它仍然很快 一个包装器的两个或多个独立实例通常是否可以访问非托管库而不受干

为了实现这一点,我尝试获取包装器的两个实例,一个用于quick stuff,另一个在并行线程中用于计算耗时信息。但是,当我实例化其中一个速度慢的分析器时,即使是速度快的分析器也会变慢

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);

}
公共级ScrWrapper
{
私有常量字符串DllName=@“Analyzer.dll”;
public bool IsConfigLoaded{get;private set;}
public bool isanalyticsuccessful{get;private set;}
公共分析器()
{
IsConfigLoaded=false;
IsAnalyticsSuccessful=false;
}
公共分析器(字符串configFileName,ScrProcLevel procLevel=ScrProcLevel.PL\u NONE)
{
IsConfigLoaded=false;
IsAnalyticsSuccessful=false;
LoadConfig(configFileName,procLevel);
}
public void LoadConfig(字符串configFileName,ProcLevel ProcLevel=ScrProcLevel.PL\u NONE)
{
如果(configFileName.Length<1)
抛出新ArgumentException(“空的configFileName。必须包含有效的文件名”);
如果(!System.IO.File.Exists(configFileName))
抛出新ArgumentException(String.Format(“找不到无效的configFileName.File:{0}”,configFileName));
如果(!System.IO.File.Exists(DllName))
抛出新ArgumentException(String.Format(“未找到无效的DllName.File:{0}”,DllName));
bool b_config_status=false;
尝试
{
StringBuilder sb=新的StringBuilder(configFileName);
ScanAuto_EnableWriteOut(真);
b_config_status=ScanAuto_LoadConfig(sb);
}
捕获(例外情况除外)
{
抛出新的ScrException(“错误:非托管分析器抛出异常。”,ex);
}
如果(!b_配置_状态)
{
抛出新的ScrException(String.Format(“错误:加载配置文件失败,b_config_status=false”);
}
IsConfigLoaded=b_配置_状态;
_ProcLevel=ProcLevel;
分析仪_SetProcLevel(_ProcLevel);
}       
...     
[DllImport(DllName,CallingConvention=CallConvention)]
[返回:Marshallas(UnmanagedType.I1)]
私有外部静态bool ScanAuto\u LoadConfig(StringBuilder\u pConfigFName);
}

据我所知,您的包装看起来很好,所以事实上ScanAuto_LoadConfig方法(以及它初始化的成员)是静态的,导致它每次都覆盖相同的配置位。请参见

这是可能的-从我所看到的一点来看,您实例化的方式应该很好,因此问题一定在包装器或非托管dll中。感谢您可能没有库的代码,但是您可以发布包装器代码以便排除这种情况吗?谢谢您的回答。我从包装器代码中添加了相关部分。我正要请求DllImport位,而您添加了它!据我所知,您的包装看起来很好,所以很可能是ScanAuto_LoadConfig方法(以及它初始化的成员)是静态的,导致它每次都覆盖相同的配置位。谢谢你的解释!我联系了动态链接库的供应商以得到这个问题的答案。我刚刚从供应商那里得到了答案-这确实是图书馆的错。所以,如果你想把你的评论变成一个答案,我想把这个问题标记为已解决。