我的应用需要显示数据字符串,这些字符串来自未托管的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
我不想重复它的工作原理,因为它已经完成了很多次,但是如果我需要说多于 __> __ extspec(dllexport(,内部静态类NativeMethods,dllimport,dllimport等,我知道,我会写信。
关于流程,Xapp执行一个初始调用,可截至X.dll,然后进行打开的呼叫,然后进行一个getData调用,其中包括一个回调,以下是这样:
public delegate void dataCBfunc(IntPtr entry, IntPtr arg);
我的静电回调功能包括转换
string line = Marshal.PtrToStringAnsi(entry);
整个事情都按照我在测试床应用中的意图进行操作。
现在我正在执行实际的MVVM实现,我希望将这些行添加到我绑定到DataGrid的ObservableCollection中。这是我的问题所在。
回调是静态的。我希望能够将不透明的指针传递给班级或观察力的基本指针的基本C 技巧,作为对X.dll的" 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
我也尝试了其他一些事情,并且基本上得到了相同类型的消息,这是有道理的。
也就是说,如果不做可怕的事情,我将如何实现自己的目标?可怕的可能意味着将其写入文件并稍后阅读...不太可怕的可能是使用共享内存来执行相同的操作……或者我可以添加几个插座并以此方式进行操作。我觉得我不必求助于这样的事情。如果有人可以帮助解决如何解决此问题的提示,我将不胜感激。感谢您的阅读。
我的工作备份解决方案,如果无法将ViewModel(或ObservableCollection(的直接实例传递到DLL,然后备份到回调:
:- 命名视图用户控件我添加到MainWindow XAML
- 在MainWindow构造函数中创建ViewModel实例
- 将视图控制DataContext和MainWindow DataContext设置为ViewModel实例
使用
访问我的静态回调中的ObservableCollectiontheViewModel rvm = application.current.mainwindow.datacontext as theviewModel;
,我仅限于我的应用程序中的一个viewModel实例,但是如果需要,我可以将其扩展到MainWindow DataContext指向一个实例表,并在回调参数中使用索引来引用正确的一个。