Tag: interop

如何使用.NET 4.0读取.RTF文件

我见过使用Word 9.0对象库的示例。 但我在VS2010中安装了Office 2010 Beta和.NET 4.0。 有关如何使用新Word Dlls的任何提示? 所以我只是想用.NET3.5或更高版本获得RTF到TEXT的function。

如何将多个收件人添加到mailitem.cc字段c#

Oki,所以我正在研究outlook .msg模板。 以编程方式打开它们,根据我的数据库中的内容插入值。 恩。 当我想在“收件人”字段中添加多个reciepients,而不是如下所示, mailitem.To = a + “;” + b + “;” + c; 我在下面做什么,这更简单,特别是当我在循环中这样做时。 mailitem.Recipients.add(“a”); mailitem.Recipients.add(“b”); mailitem.Recipients.add(“c”); 我的问题是,我还想在“CC”字段添加多个收件人,上面的function仅适用于“收件人”字段。 如何将多个收件人添加到“CC”字段,而无需进行字符串操作。 通常我会像这样添加收件人到cc, mailitem.CC = a + “;” + b + “;” + c; 即时通讯使用interop.outlook并从模板创建mailitem。 提前致谢。

通过COM包装器从托管代码调用COM可见托管组件

我有一个第三方组件,让我们说FIPreviewHandler来处理预览,它实现了IPreviewHandler。 FIPreviewHandler实现为托管组件,并通过互操作使用IPreviewHandler接口和相关接口。 FIPreviewHandler使用regasm.exe作为COM注册。 我有一个客户端应用程序也是托管的。 我想在我的应用程序中创建一个FIPreviewHandler实例作为COM组件。 我有一个interop程序集,定义IPreviewHandler和相关的接口。 当我使用Activator.CreateInstance()创建FIPreviewHandler的实例时,对GetTypeByCLSID()返回的类型使用FIPreviewHandler的正确CLSID,它返回一个托管实例,因为它具有可用的实际程序集,并跳过COM 。 当我尝试将此实例作为任何接口(例如IPreviewHandler)进行QI /转换时,它返回null,因为它作为托管对象加载,尽管FIPreviewHandler实现的IPreviewHandler接口与我在interop中的接口相同,但它在一个不同的命名空间/程序集中,因此为null。 如果要返回一个COM实例/ RCW(System .__ ComObject),它将不会考虑名称空间,并且会被强制转换,并返回一个有效的实例。 FIPreviewHandler是一个32位组件,在64位Win7机器上,如果我将我的客户端应用程序编译为“任何CPU”,Activator.CreateInstance()将返回一个COM实例/ RCW(System .__ ComObject),因为它会找到64位实现FIPreviewHandler,因此返回一个代理。 在这种情况下,我的应用程序工作正常。 但是当我为x86编译它时,它获得32位实现,并返回实际托管类的托管实例,而不是COM实例,因此失败。 我不能使用FIPreviewHandler程序集中定义的接口,因为我必须为IPreviewHandler编写通用客户端,我的应用程序将与任何实现IPreviewHandler的组件一起使用,这对于基于C ++的客户端访问FIPreviewHandler作为COM对象非常有用,但是失败了对于托管客户。 我希望我有意义,我会非常感激任何帮助。

使用c ++ / cli桥连接c ++和c#代码

我有一个使用本机c ++ dll的本机c ++代码的客户端应用程序。 我正在调查将此代码与c#dll连接的可能性,因为它们更容易编写。 我决定编写一个c ++ / cli bridge dll,它可以加载LoadLibrary并将调用传递给c#dll。 客户端和dll之间的通信使得客户端传递指向接口对象的指针,然后dll通过该接口对象与客户端通信。 我将此对象包装在c ++ / cli桥接代码中,以便使用c#代码。 桥接器还应该使用__declspec(dllexport)公开几个函数,并将这些调用传递给c#dll,因此它需要有一个指向ac#接口的指针,它将传递给它们。 我想在gcroot 包装器中使用ac#object,但问题是我在这两个dll之间得到循环依赖。 C#dll需要引用bridge dll才能使用包装类,而bridge dll需要引用c#dll来使用接口类。 我知道我可以使用COM而不是用gcroot包装c#对象,但我不想。 有没有办法解决?

是否有最佳实践来访问C ++本地COM函数以从C#进行互操作?

是否有最佳实践来访问C ++本地COM函数以从C#进行互操作? 例如,如果我有100个C ++方法(基本上是本机库),它与核心窗口组件交互。 我想基本上在C#中为这些C ++方法创建一个包装器,所以我所有新雇用的员工都可以使用它而不是C ++等.C ++代码是遗留的并且让我感到害怕,所以我只想处理它一次。 这里的方法是否为每个方法都有一个相应的C#方法? 事实上,还有另一种方法吗? 我可以使用某种包装子系统吗? 你们这些人一般都这样做吗? 此外,是否有任何性能考虑等?

C ++ / cli – >调用c#dll – >调用OpenFileDialog问题

我编写了一个C ++程序的扩展。 我编写标准的C / C ++ dll,我使用IJW来调用C#dll。 这一直很有效,直到我编写并调用了一个C#dll,后者又调用了一个OpenFileDialog和一个SaveFileDialog。 无论何时使用ShowDialog调用,应用程序都会冻结。 因此,在制作“最小工作示例”时,我得到了一个:System.Windows.Forms.dll中发生的类型为“System.Threading.ThreadStateException”的未处理exception 附加信息:在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。 确保您的Main函数标记了STAThreadAttribute。 仅当调试器附加到进程时才会引发此exception。 所以,我试图在我的“最低工作示例”中添加主要的STAThread属性,我得到了这个错误。 错误C2337:’STAThread’:找不到属性 那么,有两个问题: 如何d0我得到“最低工作示例”工作和 如何让真正的应用程序运行? (甚至可以在#pragma非托管块中添加STAThread属性吗?) #pragma unmanaged BOOL WINAPI DllMain (HINSTANCE hDLL, DWORD dwReason, LPVOID lpReserved) { … }

通过C ++桥从.NET调用Python

每隔几个月我会谷歌搜索“从.NET调用Python”,因为我太累了,无法重新发明/移植东西并在Python中找到一些很酷的代码。 两种流行的解决方案是启动外部流程或使用IronPython IronPython不适合我,因为我可能想要使用Python的原因通常是一些依赖于NumPy / ScyPy的库。 最近我开始学习C ++的基础知识,并发现可以在C ++中嵌入Python,并找到了一篇带有示例的文章 。 通过P / Invoke从.NET调用C ++非常容易。 所以我的方案是用.NET中的数据调用一些Python脚本并返回结果。 在我开始深入挖掘之前,我想问一下是否有人尝试过这种方法,这是可行的还是有更好的方法? 特别, 所有Python库是否都可以在嵌入时工作,例如NumPy,ScyPy,Pandas,PyMC等? 嵌入式Python是否可以像使用标准C ++一样使用C ++ / CLI? 如何将复杂数据传递给Python:序列化为JSON还是类型之间存在映射? 性能是一个问题:主要用例是在实时数据的滑动窗口上进行一些数字工作。 我认为外部流程对于频繁的通话来说非常慢 – 如果我错了,请纠正我?

System.Runtime.InteropServices.ComTypes.IStream到System.IO.Stream

在.NET 3.0项目中,我需要通过P / Invoke进行一些调用(特别是对于PrintTicket Provider函数,如PTConvertPrintTicketToDevMode())。 该框架具有COM IStream接口的托管定义: System.Runtime.InteropServices.ComTypes.IStream 我需要它作为System.IO.Stream,以便我可以轻松地使用.NET类(如XmlDocument)和这些导入函数的输出。 但是,除了一次读取和写入一个字节块之外,我无法看到一种不那么痛苦的方法将此来回转换为System.IO.Stream 。 对于看似非常普遍的任务来说,这似乎太过愚蠢了。 或者我是以错误的方式去做的? 我将PTConvertPrintTicketToDevMode ()导入为: [DllImport(“prntvpt.dll”)] public static extern int PTConvertPrintTicketToDevMode(IntPtr hProvider, IStream pPrintTicket, EDefaultDevmodeType baseDevmodeType, EPrintTicketScope scope, IntPtr pcbDevmode, out IntPtr ppDevmode, [MarshalAs(UnmanagedType.BStr)]out String pbstrErrorMessage);

使用.NET互操作编译VB6应用程序,仅在我的机器上编译时运行

我最近在.NET(Visual Studio 2008,项目目标是.NET 2.0)中开发了一个用于VB6应用程序的互操作用户控件。 该程序集公开了1个控件,1个类,以及一些枚举和结构。 我使用此处的Interop Forms Toolkit 2.0项目模板的C#转换开发了它。 程序集具有强名称,并安装在GAC中,并使用以下脚本在regasm中注册: @”C:\gacutil.exe” /i “C:\Program Files\AppName\Control.dll” /f @”C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe” “C:\Program Files\AppName\Control.dll” /tlb:”C:\Program Files\AppName\Control.tlb” 问题:当我在我的机器上编译VB6应用程序时,它将在任何其他机器上运行(当然,安装了控件)。 但是,当应用程序在不同的计算机上编译时,它将在该计算机上运行,​​但不会在任何其他计算机上运行。 当我说它没有运行时,我的意思是你试图运行它,绝对没有任何反应。 我使用OleView来检查我的机器和其他机器上的控件,并且所有GUID在类型信息中都是相同的。 唯一的区别是一个有行importlib(“stdole2.tlb”)而另一个有importlib(“STDOLE2.TLB”)。 我的机器有:Visual Studio 6.0 sp6,VB6互操作用户控件模板,Windows SDK 6.0和6.0A,Visual Studio 2008 sp1。 这台机器是有效的。 同事机:Visual Studio 6.0 sp6,Visual Studio 2005 另一台机器:Visual Studio 6.0 sp6,Visual Studio 2008. 2008今天早上安装了这个并没有解决问题。 我如何让这些其他机器正确编译VB6应用程序,以便它运行在编译它的机器以外的机器上? (在评论中提出更多信息请求,我将对其进行编辑以提供答案。) 编辑: 关于注册控件的权限提出了建议。 我想澄清控制似乎运作良好。 我在工作的机器和不工作的机器上以完全相同的方式注册它。 当引用控件的VB6应用程序在我自己的机器上编译时,问题就会出现。 […]

我可以控制分配给互操作程序集的版本号吗?

我有一个使用本机C ++ COM对象的C#程序。 Visual Studio生成一个interop程序集,其中包含COM对象中类型的包装器。 每次重新编译C#程序时,互操作程序集都有1.0.0.0版本。 这对安装程序有害 – 有时我们扩展COM对象接口(在某个接口的末尾添加新方法),因此必须更改互操作程序集。 当安装程序尝试更新现有安装时,它认为互操作程序集没有更改(因为它仍然具有版本1.0.0.0)并且跳过更新它并且程序不起作用。 如何控制分配给互操作程序集的版本号?