我知道我可以让它在技术上工作,但我想实施最干净的解决方案。情况如下:
我有一个托管库,它包装了一个非托管 C 风格的库。我目前包装的 C 风格库功能会进行一些涉及字符串列表的处理。库的客户端代码可以提供一个委托,这样在列表处理过程中,如果遇到“无效”的场景,库可以通过这个委托回调给客户端,让他们选择使用的策略(抛出异常,替换无效字符等)
理想情况下,我希望将所有托管 C++ 隔离在一个函数中,然后能够调用一个单独的函数,该函数只接受非托管参数,以便所有本机 C++ 和非托管代码在这一点上被隔离。为这个非托管代码提供回调机制被证明是我的症结所在。
#pragma managed
public delegate string InvalidStringFilter(int lineNumber, string text);
...
public IList<Result> DoListProcessing(IList<string> listToProcess, InvalidStringFilter filter)
{
// Managed code goes here, translate parameters etc.
}
#pragma unmanaged
// This should be the only function that actually touches the C-library directly
std::vector<NativeResult> ProcessList(std::vector<char*> list, ?? callback);
在这个片段中,我想在 ProcessList 中保留所有 C 库访问,但是在处理过程中,它需要做回调,并且这个回调以 InvalidStringFilter 委托的形式提供,该委托是从一些客户端传入的我的托管图书馆。