如何用带有非托管DLL调用的回调的字符串填充c#observable集合?

时间:2017-06-29 19:50:39

标签: c# wpf dll callback unmanaged

我的应用程序需要显示数据字符串,这些字符串来自非托管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

我也尝试了其他一些东西,并且基本上得到了相同类型的消息,这是有道理的。

那就是说,如果不做一些可怕的事情,我怎么能实现我所追求的目标呢?可怕的意思是将它写入文件并稍后阅读...不太可能使用共享内存来做同样的事情......或者我可以添加几个套接字并以这种方式执行。我觉得我不应该诉诸这样的事情。如果有人可以提供有关如何解决这个问题的提示,我会很感激。谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

我的工作备份解决方案,如果没有办法将ViewModel(或ObservableCollection)的直接实例传递给dll并备份回调:

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

    访问静态回调中的ObservableCollection

    TheViewModel rvm = Application.Current.MainWindow.DataContext as TheViewModel;

  5. 按原样,我在我的应用程序中仅限于一个TheViewModel实例,但如果有必要,我可以扩展它以使MainWindow DataContext指向实例表并使用回调参数中的索引来引用正确的