我的应用程序需要显示数据字符串,这些字符串来自非托管X.dll,它通过回调函数传递每一行。
我已经创建了这个管道来处理c#中的X.dll:
Xapp
-> X-csharp.dll // c#, managed front end to X-api.dll
-> X-api.dll // Shim to expose the pieces of X.dll needed
-> X.dll // Original dll
我不想重复它是如何工作的,因为已经多次完成,但如果我需要说的不仅仅是 __ declspec(dllexport),内部静态类NativeMethods,DllImport等, 让我知道,我会写下来。
关于流程,Xapp执行一个初始化调用,该调用将转到X.dll,然后是一个打开调用,然后是一个getData调用,其中包含一个声明如下的回调:
public delegate void dataCBfunc(IntPtr entry, IntPtr arg);
我的静态回调函数包括转换
string line = Marshal.PtrToStringAnsi(entry);
整个过程就像我在testbed应用程序中所预期的那样。
现在我正在进行真正的MVVM实现,我希望将这些行添加到我已绑定到数据网格的ObservableCollection中。这就是我的问题所在。
回调是静态的。我希望做一个基本的C ++技巧,将一个不透明的指针传递给类的实例或者传递给ObservableCollection,作为Xql的“arg”arg。 X.dll不需要它,它只是将它传递回回调,以便可以将该行添加到ObservableCollection中。我试过了
ObservableCollection<RemoteListModel> remoteList
= arg as ObservableCollection<RemoteListModel>;
然后回来了
Error CS0030: Cannot convert type 'System.Collections.ObjectModel.ObservableCollection<Xapp.Model.RemoteListModel>' to 'System.IntPtr' Xapp
我也尝试了其他一些东西,并且基本上得到了相同类型的消息,这是有道理的。
那就是说,如果不做一些可怕的事情,我怎么能实现我所追求的目标呢?可怕的意思是将它写入文件并稍后阅读...不太可能使用共享内存来做同样的事情......或者我可以添加几个套接字并以这种方式执行。我觉得我不应该诉诸这样的事情。如果有人可以提供有关如何解决这个问题的提示,我会很感激。谢谢你的阅读。
答案 0 :(得分:0)
我的工作备份解决方案,如果没有办法将ViewModel(或ObservableCollection)的直接实例传递给dll并备份回调:
使用
访问静态回调中的ObservableCollectionTheViewModel rvm = Application.Current.MainWindow.DataContext as TheViewModel;
按原样,我在我的应用程序中仅限于一个TheViewModel实例,但如果有必要,我可以扩展它以使MainWindow DataContext指向实例表并使用回调参数中的索引来引用正确的