【发布时间】:2013-02-13 10:54:41
【问题描述】:
我在我的代码 (C#) 中使用了一个非托管库(用 C++ 编写)。库提供的所有方法都是静态的。我使用 P/Invoke 与库进行通信。这是图书馆的工作方式:
- 在调用所有其他方法之前,您需要调用一个初始化方法(这需要一个参数,并且该参数只能在初始化期间设置)。
- 有一个 settings 方法可以更改库的不同设置,如果您需要更改库的工作方式(更像是微调库),则需要运行此方法。可以随时更改设置。
- 有一种方法可以接受一个数字数组,然后返回另一个数组。我们称之为中间操作。这个操作需要一段时间,所以我想缓存它并防止每次都计算它。
- 前一个方法(中间操作)返回的数组是创建结果的最后一个方法的输入。我们称之为主要操作
我通常希望有不同的库实例,一个具有设置 A,另一个具有 设置 B。由于库是静态的,我不能。
如何将这个库包装在实例类中?可能,我的类的每个实例都需要在内存中加载库的新实例(因为库本身的每个实例都是静态的,并且您不能在库的一个实例中具有两种不同的设置)。
除了重写库(因为我无法控制它的编写方式)之外,是否有解决方法?
而且我真的很希望能够处理对操作方法的并行调用。
【问题讨论】:
-
除了传递给主操作之外,还需要中间操作的结果吗?
-
是的,我需要它来缓存。创建需要一段时间,我想缓存它。
-
是否可以同步访问库并每次调用
SetSettings? (或者至少当有人使用上次使用的不同“实例”时) -
是否可以在通话之间更改设置?如果是这样,中间操作和主要操作是否都依赖于这些设置对于相应的调用相同?想到的是一个类,它的对象存储设置并在每次操作之前将它们应用到库中。为了加快速度,您可以检查当前设置(通过存储应用设置的唯一 ID/散列的东西包装库)并仅在需要时应用存储的设置。
-
这也是我的建议。