我如何用字符串填充C#可观察的集合,并带有一个不受管理的DLL调用的回调



我的应用需要显示数据字符串,这些字符串来自未托管的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,然后备份到回调:

  1. 命名视图用户控件我添加到MainWindow XAML
  2. 在MainWindow构造函数中创建ViewModel实例
  3. 将视图控制DataContext和MainWindow DataContext设置为ViewModel实例
  4. 使用

    访问我的静态回调中的ObservableCollection

    theViewModel rvm = application.current.mainwindow.datacontext as theviewModel;

,我仅限于我的应用程序中的一个viewModel实例,但是如果需要,我可以将其扩展到MainWindow DataContext指向一个实例表,并在回调参数中使用索引来引用正确的一个。

相关内容

最新更新