我知道我可以在技术上实现这个,但我想要实现最简洁的解决方案。情况如下:
我有一个托管库,它包装了一个非托管的C风格库。我目前正在包装的C风格库功能涉及一组字符串的处理。该库的客户端代码可以提供一个委托,以便在列表处理过程中,如果遇到“无效”场景,则库可以通过此委托回调到客户端,并允许他们选择要使用的策略(抛出异常、替换无效字符等)。
我理想情况下想要的是,所有的托管C++都隔离在一个函数中,然后能够调用一个仅接受非托管参数的单独函数,以便所有的本地C++和非托管代码都隔离在那个点上。为这个非托管代码提供回调机制对我来说是个棘手的问题。
在这段代码中,我希望将所有C库访问保留在ProcessList中,但在处理过程中,它需要执行回调操作,这个回调操作是以InvalidStringFilter委托的形式提供的,该委托从我的托管库的某个客户端传递进来。
我有一个托管库,它包装了一个非托管的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);
在这段代码中,我希望将所有C库访问保留在ProcessList中,但在处理过程中,它需要执行回调操作,这个回调操作是以InvalidStringFilter委托的形式提供的,该委托从我的托管库的某个客户端传递进来。