我有一个C ++ DLL,它是ADOBE Acrobat的一个插件。它需要经常(来回)和相当数量的复杂数据结构与WPF流程进行对话 任何想法可能是最好的方式。需要一些有点长期和可维护的东西,换句话说,会喜欢一些关于某些东西的想法,这些想法可以让两个流程都做出类似于方法调用的东西,而某些基础架构片段可以进行编组和调度。我已经尝试过Windows消息,但在ADOBE上遇到了一些冲突问题,对于导致dll加载adobe以加载CLR的任何事情也没有真正感兴趣。只有我想到的其他东西才是管道或http 在此先感谢
答案 0 :(得分:1)
命名管道可以做,但你不会觉得只是调用函数。命名管道是相当低级的IPC。其他IPC选项包括:
答案 1 :(得分:1)
我会选择COM:
regasm
)如果你需要双向通信,C ++ DLL也可以实现一个COM接口,然后从WPF应用程序访问。
这是我用来将旧版C ++应用程序与新的.NET服务连接起来的,它运行得很好。最大的问题是找到了解COM的人,但幸运的是,这并不需要深入了解COM。
答案 2 :(得分:0)
你对COM的暗示非常有趣。我试图实现这个概念。 我在WPF CallDllFromWpf3Interface项目中创建了一个接口:
using System.Runtime.InteropServices;
namespace CallDllFromWpf3Interface
{
[Guid("F6E0E2E8-CCC6-487B-8BF1-261265061E6A")]
public interface SetValueInterface
{
void SetValue(int value);
}
}
然后我用regasm工具生成了typelib: regasm CallDllFromWpf3Interface.exe / tlb
使用“oleview”工具,我可以看到typelib和界面。
下一步是创建一个名为“CallSetValueInterface”的c ++ dll项目。
在我的CallSetValueInterface.cpp文件中,我写了这一行:
#import "D:\Thomas\Programming\WPF\Basics\CallDllFromWpf\CallDllFromWpf3Interface\CallDllFromWpf3Interface\bin\Debug\CallDllFromWpf3Interface.tlb"
void
CallSetValueInterface::startAcq(void)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CallDllFromWpf3Interface::SetValueInterfacePtr Svip("f6e0e2e8-ccc6-487b-8bf1-261265061e6a");
Svip->SetValue(55);
Svip = NULL;
CoUninitialize();
}
成功构建dll项目后,我将“CallSetValueInterface.dll”复制到“CallDllFromWpf3Interface”项目中。
最后我将我的WPF代码更改为:
#region SetValueInterface Members
public void SetValue(int value)
{
MyValue = value;
}
#endregion
[DllImport("CallSetValueInterface.dll", EntryPoint = "startAcq", ExactSpelling = true, SetLastError = true)]
public static extern void StartAcqFromDll();
private void Button_Click(object sender, RoutedEventArgs e)
{
StartAcqFromDll();
}
当调试器进入StartAcqFromDll()时,出现了一个错误对话框“在CallDllFromWpf3Interface.exe中发生了'System.Runtime.InteropServices.SEHException'类型的未处理异常”。
有人知道什么是错的吗?
此致
ThomasL。