我在我的代码(C#)中使用了非托管库(用C ++编写)。库提供的所有方法都是静态的。我使用P / Invoke与库进行通信。以下是图书馆的工作方式:
我通常喜欢使用不同的库实例,一个使用设置A ,另一个使用设置B 。由于库是静态的,我不能。
如何在实例类中包装此库?可能我的类的每个实例都需要在内存中加载一个新的库实例(因为库本身的每个实例都是静态的,并且在库的一个实例中不能有两个不同的设置)。
除了重新编写库之外,是否有解决方法(因为我对它的编写方式没有任何控制权)?
我真的希望能够处理对操作方法的并行调用。
答案 0 :(得分:0)
以下是对该问题的评论中所述内容的示例实现:
public class Library
{
private static class Native
{
[DllImport("foobar.dll")]
public static extern void Initialize();
[DllImport("foobar.dll")]
public static extern void Settings(int param1, string param2);
[DllImport("foobar.dll")]
public static extern float[] Intermediate(float[] input);
[DllImport("foobar.dll")]
public static extern void MainMethod(float[] main);
}
private static readonly object sync = new object();
private int param1;
private string param2;
static Library()
{
Native.Initialize();
}
public void Settings(int param1, string param2)
{
this.param1 = param1;
this.param2 = param2;
}
public float[] Intermediate(float[] input)
{
lock (sync)
{
Native.Settings(param1, param2);
return Native.Intermediate(input);
}
}
public void MainMethod(float[] input)
{
lock (sync)
{
Native.Settings(param1, param2);
Native.MainMethod(input);
}
}
}
最重要的事情
答案 1 :(得分:0)
正如我在评论中所建议的那样,如果需要进行腭化,我能想到的唯一解决方法就是采用多进程方法:将每个“设置”包装在一个独立的进程中。当然,这将使进程之间的通信和数据流量成为瓶颈的新候选者(无论您将使用WCF命名管道,远程处理,WM_COPYDATA还是套接字)。