Tag: 互操作

在WPF或Console C#app中接收WM_COPYDATA结构

我正在编写一个C#应用程序,需要与用本机C编写的另一个应用程序进行通信。到目前为止,我已经想出了如何使用User32.dll SendMessage将消息从我的C#应用​​程序发送到C应用程序。 但是,我无法弄清楚如何让C#应用程序从C应用程序接收消息。 我已经看到了覆盖WndProc方法的WinForms示例,但是在WPF或Console应用程序中没有要覆盖的WndProc方法。 当然,至少可以在控制台应用程序中执行此操作。 对?

又一个System.Runtime.InteropServices错误

我们与MongoDB一起使用的每个项目都会在没有加载的System.Runtime.InteropServices库中出现问题。 这次错误很有趣: 外部exception找不到lib的4.3.0.0版本。 但是内部exception找不到版本4.0.0.0 有没有人对此有所了解? 有关此问题的更多信息: 所以,NuGet已经安装了4.3.0.0 packages.config确认我已经安装了4.3.0.0, 然而, app.config似乎总是与现实不同步: 添加了关于版本4.0.1.0的一行 在同一行… csproj是胡说八道: x:\Packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll 因为它声称引用4.0.1.0的路径为4.3.0.0 有一些东西被打破了,它总是发生在那个完全相同的lib上; 不仅仅是这个项目:在我包含MongoDB的任何地方,这个lib都是一个依赖项,每次都有一些随机问题。 当我尝试手动加载时: var Name = new AssemblyName(“System.Runtime.InteropServices.RuntimeInformation, Version=4.3.0.0”); var Asm = Assembly.Load(Name); 它也失败了。 我发现System.Runtime.InteropServices.RuntimeInformation.dll不会被复制到build文件夹,即使它包含在项目中。 我找到了一个讨厌的解决方法:如果我在主exe中包含MongoDB,即使我不使用它,它依赖于Interop lib,这迫使lib被复制到build文件夹,然后后续调用工作。

在C#中包装Visual C ++

我需要使用C ++进行一些进程注入,但我更喜欢将C#用于除低级别之外的所有内容。 我听说过“function包装”和“编组”,已经做了很多谷歌搜索,并在这里和那里找到了一些信息,但我仍然非常缺乏。 我按照有用的顺序阅读的内容; http://msdn.microsoft.com/en-us/library/ms235281(VS.80).aspx http://www.drdobbs.com/cpp/184401742 http://geeklit.blogspot.com/2006/08/calling-c-lib-from-c.html 如何在C#中包装所有较低级别的东西(本机C ++),这样我就可以用我更熟悉的语言C#轻松地命令这些函数? 非常感谢有关该主题的任何信息。

C#.NET图表库/代码?

我正在创建一些报告软件,它将生成包含图表和所有相关数据的excel工作簿。 除了内置的库和.NET Office集成function之外,还有其他任何人发现对创建类似项目有用的工具或代码吗? 编辑:我的目标是winforms。

从C ++到C#的数组

我试图将一个双数组(它实际上是一个std :: vector,但转换后转换)从c ++ dll传递到ac#script(unity)。 使用此处概述的方法https://stackoverflow.com/a/31418775 。 我可以在我的控制台上成功地获得arrays打印的大小但是我无法使用“CoTaskMemAlloc”来为arrays分配内存,因为我使用Xcode并且它似乎没有COM。 对于更多的背景,这个数组是GUI控件的一部分,c ++创建它并且用户使用c#GUI进行编辑 – 因此计划是在编辑时将数组传递回c ++。 C++ code extern “C” ABA_API void getArray(long* len, double **data){ *len = delArray.size(); auto size = (*len)*sizeof(double); *data = static_cast(CoTaskMemAlloc(size)); memcpy(*data, delArray.data(), size); } C# code [DllImport(“AudioPluginSpecDelay”)] private static extern void getArray (out int length,[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] out double[] array); int […]

如何让C#与Javascript互操作?

我想在我的C#程序中托管Javascript。 我想允许用户编写自定义Javascript代码,让我的C#程序运行他们的函数,并允许用户使用我的框架代码。 是否有可能做到这一点? 如果是这样,怎么样? 编辑:要清楚,我没有在这个项目中使用ASP.NET。

为C ++ DLL实现回调C#函数

我正在为我的C ++库编写一个DLL包装器,从C#调用。 此包装器还应具有从库调用并在C#中实现的回调函数。 这些函数例如具有std :: vector 作为输出参数。 我不知道如何做到这一点。 如何通过回调函数将未知大小的缓冲区从C#传递到C ++? 我们来看看这个例子吧 CallbackFunction FunctionImplementedInCSharp; void FunctionCalledFromLib(const std::vector& input, std::vector& output) { // Here FunctionImplementedInCSharp (C# delegate) should somehow be called } void RegisterFunction(CallbackFunction f) { FunctionImplementedInCSharp = f; } 如何定义CallbackFunction以及FunctionCalledFromLib中的代码是什么? 愚蠢的一件事是:如何在C ++代码中删除C#创建的缓冲区?

与dllimport的多个参数的不同的charset

是否可以为单独的参数声明不同的charset选项? inheritance人的意思是: [dllimport(“my.dll”, charset = charset.Ansi)] void myfunc(string CharPtrInCPP, StringBuilder WCharPtrInCPP); 问题是c ++函数为文件名采用char *,为收到的数据采用wchar * … 在c ++中: void myfuncImpl(char *filename, WCHAR *buffer, int len); //another method, myfunc, wraps this

如何使用Interop将c#中的小数传递给vb6

我有一个带有属性的interop c#类: decimal ImportoDocumento { get; set; } 如果我尝试从vb6访问此属性,则会收到错误: 编译器错误:标记为受限制的函数或接口,或者函数使用visual basic中不支持的自动化类型。 所以我发现了这个部分解决方案 decimal ImportoDocumento { [return: MarshalAs(UnmanagedType.Currency)] get; [param: MarshalAs(UnmanagedType.Currency)] set; } 但货币支持最多4位小数的数字。 我的数字也有6位小数。 我能怎么做?

如何使用C#迭代和计算Word文档中的修订?

我一直在寻找这个,但无法在任何地方找到答案,所以希望有人在这里可以提供帮助。 我在C#中使用WinForms应用程序,我使用WordApplcation.CompareDocuments来比较两个文档,并获得一个结果文档,其中的更改标记为Revisions。 这很好用,除了修改隐藏文本框内的东西(我还不关心),我得到了我想要的东西。 所以下一步是计算修改了多少单词 – 特别是wdRevisionDelete和wdRevisonInsert。 唯一的问题是final.Revisions有时是空的或包含大量数据(超过500字)。 我在MSDN页面上阅读了Revisions.Count那个文件。修订版不会显示所有修订版本,只会显示主要故事并且我必须使用范围 – 但这没有帮助。 这是我目前的代码: using Word = Microsoft.Office.Interop.Word; 和 foreach (Word.Section s in final.Sections) { foreach (Word.Revision r in s.Range.Revisions) { counter += r.Range.Words.Count; if (r.Type == Word.WdRevisionType.wdRevisionDelete) delcnt += r.Range.Words.Count; if (r.Type == Word.WdRevisionType.wdRevisionInsert) inscnt += r.Range.Words.Count; } } final是WordApplication.CompareDocuments创建的Word文档 所以,正如我所说,根据MSDN,我使用range.Revision而不是document.Revision,并逐段进行。 只有一个包含六个修订版的文档显示没有,而其他文档显示100个。 所以我的问题是,如何使用修订来计算添加/删除的单词。 我打开了CompareDocuments在Word 2007中创建的文档,并且修订版本已正确标记,可以在Word中接受或拒绝 我可能会忽略的任何想法? 编辑:我注意到一些奇怪的事情 […]