Tag: interop

使用Shell32进行P / Invoke,绕过Interop.Shell32.dll生成

所以我使用以下代码将每个扩展文件属性转储到调试控制台… ShellClass shellClass = new ShellClass(); Folder dir = shellClass.NameSpace(Path.GetDirectoryName(sFilePath)); FolderItem item = dir.ParseName(Path.GetFileName(sFilePath)); for (int i = 0; i < 267; i++) { System.Debug.WriteLine(dir.GetDetailsOf(item, i)); } 由于Shell32是一个非托管库,我不能直接在程序中嵌入DLL资源,它必须生成一个互操作助手DLL。 任何人都知道Shell32中的这些函数的DLLImport命令行来绕过整个生成的互操作DLL? 我检查了pinvoke.net,在Shell32条目下,他们要么没有我想要的东西,要么它没有被命名为我所期待的。 如果无法使用DLLImport来实现这一点,那么是否有人知道使用托管DLL提取有关文件的所有扩展属性的方法,或者至少有一种方法可以在我不需要生成帮助DLL并要​​求安装程序与我正在开发的应用程序? 谢谢你!

运行时C#知道是否正在使用32位或64位版本的COM接口

我想构建一个DLL类库,使用COM Interop,使用C#,目标ANY CPU,并将其注册为32位和64位接口。 我希望能够在运行时显示使用的接口 – 如果我使用的是32位版本或64位版本。 有任何想法吗?

Interop Word – 从文档中删除页面

使用Word Interop库从Document对象中删除特定页面的最简单,最有效的方法是什么? 我注意到有一个Pages属性可以扩展/实现IEnumerable。 可以简单地删除数组中的元素,并从文档中删除页面吗? 我也看过Ranges和Section的例子,但使用起来看起来并不优雅。 谢谢。

COMexception0x800A11F9 – 无法激活应用程序

我有一个C#2.0(WinForms)项目,我尝试激活word 2003(在系统上安装了word)。 通过使用以下代码: private void ActivateWord() { this.Activate(); if (m_WordDocument != null) { try { m_WordDocument.Activate(); if (m_WordDocument.Application != null) { m_WordDocument.Application.Visible = true; m_WordDocument.Application.Activate(); } } catch (COMException comEx) { ShowError(this, comEx.Message, false); } } } 当我的应用程序执行m_WordDocument.Application.Activate()时,我收到一个COMexception0x800A11F9。 Stacktrace: “System.Runtime.InteropServices.COMException (0x800A11F9): Cannot activate application at Word.ApplicationClass.Activate() at Roxit.SquitXO.GUI.DocumentCreatie.frmSelectVeld.ActivateWord()” 可能是造成这个问题的原因是什么?

替换Word 2003文档中的MergeField并保留样式

我一直在尝试创建一个库来替换Word 2003文档中的MergeFields,一切正常,但是当我更换它时,我失去了应用于该字段的样式,有没有办法保留它? 这是我用来替换字段的代码: private void FillFields2003(string template, Dictionary values) { object missing = Missing.Value; var application = new ApplicationClass(); var document = new Microsoft.Office.Interop.Word.Document(); try { // Open the file foreach (Field mergeField in document.Fields) { if (mergeField.Type == WdFieldType.wdFieldMergeField) { string fieldText = mergeField.Code.Text; string fieldName = Extensions.GetFieldName(fieldText); if (values.ContainsKey(fieldName)) { mergeField.Select(); application.Selection.TypeText(values[fieldName]); } […]

COM互操作并排组件

我需要部署同一个C#.NET项目的多个版本。 项目输出是一个COM互操作程序集,用于本机应用程序。 我遇到的问题是我必须并排部署这个程序集的几个版本,但无论我做什么似乎都没有创建不同的版本。 而是版本覆盖彼此。 我已经尝试更改程序集GUID,尝试更改程序集版本号,尝试重新生成程序集强名称密钥,尝试更改程序集标题和说明。 我宁愿不必更改程序集中各个类型的GUID或名称以进行版本控制。 如何确保这些版本不会相互覆盖,并且我可以并排查看和部署它们? 提前致谢! using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace InteropTest { [Guid(“…”)] [ClassInterface(ClassInterfaceType.AutoDual)] public class Test { public Test() { } public string Version { get { return “1.0”; } } } }

我怎样才能获得outlook contact的头像图片?

我正在尝试获取联系人的头像图像。 using Microsoft.Office.Interop.Outlook; public sealed class OutlookAvatarFetcher { private static void FetchAvatars() { var outlook = new Application(); var folder = outlook.GetNamespace(“MAPI”).GetDefaultFolder(OlDefaultFolders.olFolderContacts); var items = folder.Items; for (var i = 0; i < items.Count; ++i) { var contact = items[i + 1] as ContactItem; if (contact == null) continue; if (contact.HasPicture) { // TODO store […]

PowerBuilder中的.NET互操作

我正在寻找一种在PB对象和.NET(C#)对象之间进行双向通信的方法。 在查看Brad的.NET控件的.NET版本时,我看到了如何为.NET对象提供对PB对象的引用。 但是在那个例子中,它被强制转换为PowerObject(基本上)。 C#代码只调用PB对象上的TriggerEvent()。 我想在C#中创建一个名为foo1的自定义类。 我想在foo1上创建一个名为bar1()的方法。 我想在PB中创建一个名为foo2的自定义类。 我想在foo2上创建一个名为bar2()的方法。 我希望能够在foo2中创建foo1的实例。 我希望能够从foo2中调用foo1.bar1()。 (我很高兴,直到这里。) 我希望能够从foo1中引用foo2。 我希望能够从foo1中调用foo2.bar2()。

.NET / C#与Python互操作

我的后端是用.NET / C#编写的,我要求我需要执行python脚本从房子的.net端传递上下文。 这些在作为Windows服务运行的名为hangfire的后台任务引擎中排队。 我做了一点挖掘并找到了IronPython ,然而,在实现之后它无法支持我需要在我的脚本中执行的许多pypi python包。 其次,我查看了Python.Net ,它是一个嵌入式解释器,嵌入或扩展了CPython。 CPython可以运行我需要的所有脚本/等等,但是,我发现一直打开/关闭python解释器会产生很多内存泄漏,并且总是存在线程约束。 有关详细信息,请参阅文档 。 我想知道.net中的这个interopt和嵌入python是否是一个好主意。 我想知道是否使用像celery之类的东西使python成为自己的执行引擎,并使用protobufs之类的东西编组数据将是一个更好的解决方案? 这给我的堆栈增加了更多的复杂性和额外的任务引擎。 我想知道是否有其他人有任何想法/反馈/经验试图完成类似的事情? 谢谢!

非矩阵数据类型的C#和MATLAB互操作性

我正在编写一个需要调用MATLAB处理例程的C#程序。 我一直在研究MATLAB的COM接口。 不幸的是,就可以交换的数据类型而言,COM接口似乎相当有限。 支持矩阵和字符数组,但似乎不支持使用COM接口在C#和MATLAB之间交换结构数据或单元数组。 例如,在下面的代码中(假设在相应的文件夹中存在名为IM000000的DICOM图像),MATLAB变量’img’和’header’分别是256×256 int16矩阵和struct。 GetWorkspaceData调用适用于’img’,但对’header’返回null,因为’header’是一个结构。 public class MatlabDataBridge { MLApp.MLAppClass matlab; public MatlabDataBridge() { matlab = new MLApp.MLAppClass(); } public void ExchangeData() { matlab.Execute(@”cd ‘F:\Research Data\'”); matlab.Execute(@”img = dicomread(‘IM000000’);”); matlab.Execute(@”header = dicominfo(‘IM000000’);”); matlab.GetWorkspaceData(@”img”, “base”, out theImg); // correctly returns a 2D array matlab.GetWorkspaceData(@”header”, “base”, out theHeader); // fails, theHeader is still null } […]