Tag: com

正确的释放COM对象的方法?

有时当我结束应用程序并尝试释放一些COM对象时,我会在调试器中收到警告: 检测到RaceOnRCWCleanUp 如果我编写一个使用COM对象的类,我是否需要实现IDisposable并在IDisposable.Dispose上调用Marshal.FinalReleaseComObject来正确释放它们? 如果没有手动调用Dispose ,那么我是否还需要在终结器中释放它们,还是GC会自动释放它们? 现在我在终结器中调用Dispose(false) ,但我想知道这是否正确。 我使用的COM对象也有一个类侦听的事件处理程序。 显然,事件是在另一个线程上引发的,所以如果在处理类时触发它,如何才能正确处理?

在C#中创建COM自动化服务器

我目前有一个用C#编写的.NET类库,它通过COM将其function暴露给C ++程序(pre -.NET)。 我们现在想要将库移出进程以释放主应用程序中的地址空间(它是一个图像处理应用程序,大图像占用了地址空间)。 我记得在我的VB6时代,人们可以创建一个“OLE自动化服务器”。 操作系统会在创建/销毁对象时自动启动和停止服务器.exe。 这看起来非常适合我们:据我所知,除了用CLSCTX_LOCAL_SERVER而不是CLSCTX_INPROC_SERVER调用CoCreateInstance之外,客户端不会发生任何变化。 我如何在C#中创建这样的进程外服务器? 要么网上没有关于它的信息,要么我的术语已经过时/过时了!

在非托管C ++项目中使用C#COM – > 0x7697C41F的第一次机会exception(KernelBase.dll)

我试图在非托管的Visual C ++解决方案中调用C#COM项目中的方法,但我不断收到下一个错误 First-chance exception at 0x7697C41F (KernelBase.dll) in Program.exe: 0x04242420 (parameters: 0x31415927, 0x6F310000, 0x00BBDAE8). 在下一段代码中 SalesForceNew::IMyObjectClassPtr p; p.CreateInstance(__uuidof(SalesForceNew::TestObject)); // error SalesForceNew::MyObject mo = p->getObject(1, “a”); 然而, mo的值如预期的那样(5,“aa”)。 我用这行代码导入tlb文件: #import “C:\Users\Bob\Desktop\ComTest\SalesForceNew\bin\x86\Debug\SalesForceNew.tlb” named_guids C#项目如下: 界面: using System.Runtime.InteropServices; namespace SalesForceNew { [ComVisible(true)] [Guid(“22901ACD-CA30-4D3E-B84B-73B707026AE5”)] public interface IMyObjectClass { MyObject getObject(int i, string s); } [ComVisible(true)] [StructLayout(LayoutKind.Sequential)] public struct […]

以编程方式执行R脚本

我有一个C#程序生成一些R代码。 现在我将脚本保存到文件,然后将其复制/粘贴到R控制台。 我知道有一个到R的COM接口,但它似乎不适用于最新版本的R(或2.7.8之后的任何版本)。 有什么方法可以在将其保存到文件后以编程方式从C#执行R脚本?

在C#中实现“out of proc”COM服务器需要做什么?

我正在尝试实现一个用C#编写的“out of proc”COM服务器。 我该怎么做呢? 我需要C#代码从我的主要C ++应用程序“out of proc”,因为我无法将.NET运行时加载到我的主进程空间 为什么?: 我的C ++代码位于一个DLL中,该DLL被加载到许多不同的客户EXE中,其中一些使用不同版本的.NET运行时。 由于只能有一个运行时加载到一个进程中,我最好的选择似乎是将我的C#代码放入另一个进程。

来自C#的Outlook 2007 – COMexception,TYPE_E_LIBNOTREGISTERED

我正在尝试制作一个可以打开新的Outlook 2007消息的程序。 我引用了COM选项卡Microsoft Outlook 12.0 ObjectLibrary。 这些项目出现在VS的参考文献中: Microsoft.Office.Core Microsoft.Office.Inerop.Outlook 现在我尝试调用以下代码: var _outlookInstance = new Microsoft.Office.Interop.Outlook.Application(); var _message = (OutlookApp.MailItem)_outlookInstance.CreateItem(OutlookApp.OlItemType.olMailItem); 其中OutlookApp == Microsoft.Office.Interop.Outlook命名空间。 在调用第二行列表时,我不断收到此exception:( InvalidCastException) 无法将“Microsoft.Office.Interop.Outlook.ApplicationClass”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Outlook._Application”。 此操作失败,因为由于以下错误,对IID为“{00063001-0000-0000-C000-000000000046}”的接口的COM组件的QueryInterface调用失败:库未注册。 (HRESULT的例外情况:0x8002801D(TYPE_E_LIBNOTREGISTERED))。 该代码在我的其他工作站上适用于Outlook 2003。 我会很感激任何想法如何解决它。

用于为COM DLL创建.NET包装器的工具?

是否有任何开源工具可以自动为COM DLL库生成.NET包装器?

以编程方式注册C#/ VB.NET COM DLL

问题:我有一个.NET dll,我在C ++程序中使用它。 现在我必须在部署计算机上以编程方式注册dll。 我该怎么做(以编程方式!不使用regasm)? 我记得,当我曾经用C ++ dll调用VB6 dll时,我不得不使用DllRegisterServer和DllUnregisterServer。 .NET dll仍然如此吗? 看来我必须以某种方式将dllregisterserver函数添加到.NET dll中。

如何在没有Application.Run的情况下从VBE加载项运行宏?

我正在为VBE编写COM加载项,其中一个核心function是在单击命令栏按钮时执行现有的VBA代码。 代码是用户在标准(.bas)模块中编写的unit testing代码,其模块如下所示: Option Explicit Option Private Module ‘@TestModule Private Assert As New Rubberduck.AssertClass ‘@TestMethod Public Sub TestMethod1() ‘TODO: Rename test On Error GoTo TestFail ‘Arrange: ‘Act: ‘Assert: Assert.Inconclusive TestExit: Exit Sub TestFail: Assert.Fail “Test raised an error: #” & Err.Number & ” – ” & Err.Description End Sub 所以我有这个代码获取主机Application对象的当前实例: protected HostApplicationBase(string applicationName) { Application […]

如何从控制台应用程序处理COM事件?

我正在使用来自第三方库的COM对象来生成定期事件。 当我使用Winforms应用程序中的库,将对象作为类成员并在主窗体线程中创建它时,一切正常。 但是,如果我从另一个线程创建对象,我不会收到任何事件。 我的猜测是我需要在用于创建对象的同一个线程中有某种事件循环。 我需要从控制台应用程序中使用此对象。 我想我可以使用Application.DoEvents,但我宁愿不在控制台App中包含Winforms命名空间。 我怎么解决这个问题? 更新3(2011-06-15):供应商终于回答了。 简而言之,他们说Application.Run创建的消息泵与Thread.Join创建的消息泵之间存在一些差异,但他们不知道这有什么区别。 我同意他们; 任何关于此事的光明都会非常感激。 更新: 从理查德评论到mdm回答: 如果其他组件是单线程并从MTA实例化,则Windows将创建工作线程+窗口+消息泵并执行必要的编组。 试着听从他的建议,我正在做以下事情: 更新2: 我改变了JoãoAngelo回答后的代码。 using System; namespace ConsoleApplication2 { class Program { [STAThread] static void Main(string[] args) { MyComObjectWrapper wrapper = new MyComObjectWrapper(); } } class MyComObjectWrapper { MyComObject m_Object; AutoResetEvent m_Event; public MyComObjectWrapper() { m_Event = new System.Threading.AutoResetEvent(false); System.Threading.Thread t = […]