gpt4 book ai didi

c# - 引用相同 dll 的非托管代码的包装器的多个实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:57 26 4
gpt4 key购买 nike

我正在使用托管 C# 包装器访问非托管 C++ 库。图书馆做了一些我需要的时间消耗计算(最多 6 秒)。但与此同时,我也不断需要一些可以快速获取的数据。

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

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

}

最佳答案

据我所知,您的包装器看起来不错,所以 ScanAuto_LoadConfig 方法(以及它正在初始化的成员)是静态的,导致它每次都覆盖相同的配置位。见Static Data Members (C++)

关于c# - 引用相同 dll 的非托管代码的包装器的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23083678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com