Tag: com

C#中的MSMQ COM API

从C#使用MSMQManagement的最佳方法是什么? 当远程机器断开连接时,我需要能够查看和清除本地传出队列。 显然,一些用户可以通过COM API执行此操作,但在“COM参考”选项卡中,我没有其他网站/博客/post提到的“Microsoft Message Queue 3.0对象库”(也没有任何类似的东西)。 我在机器上搜索了Interop.MSMQ.dll,但也找不到它。 我们正在使用VS 2008并在Windows 7 64位上运行。 我错过了什么? 是否有其他机制通过“普通”托管类来实现这一目标? 谢谢

从非托管进程卸载.NET DLL

我正在使用我最好在托管DLL中的C#中实现的代码扩展我的Inno-Setup脚本。 我已经知道如何从托管DLL导出方法作为在非托管进程中使用的函数。 它可以通过IL编织来完成,并且有一些工具可以实现自动化: NetDllExport (由我编写) UnmanagedExports 因此,在导出后,我可以在Inno-Setup安装程序中从Pascal脚本调用我的函数。 但是有一个问题:DLL似乎不再被卸载了。 使用Inno-Setup的UnloadDLL(…)无效,文件将保持锁定状态,直到安装程序退出。 因此,安装程序等待2秒,然后无法从临时目录(或安装目录)中删除我的DLL文件。 事实上,它确实存在,直到有人清理驱动器。 我知道无法再从AppDomain卸载托管程序集,除非整个AppDomain关闭(进程退出)。 但是对于非托管主机进程意味着什么呢? 是否有更好的方法允许Inno-Setup在加载和使用后卸载或删除我的DLL文件?

捕获COMException特定的错误代码

我希望有人可以帮助我。 我有一个COM需要捕获的特定exception,然后尝试做其他事情,所有其他的都应该被忽略。 我的错误消息是exception: System.Runtime.InteropServices.COMException(0x800A03EC):Microsoft Office Excel无法访问文件“C:\ test.xls”。 有几个可能的原因: 所以我最初的尝试是 try { // something } catch (COMException ce) { if (ce.ErrorCode == 0x800A03EC) { // try something else } } 然而,我读了一个编译器警告: 警告22与积分常数的比较是无用的; 常量超出了’int’类型的范围….. ExcelReader.cs 629 21 现在我知道0x800A03EC是HResult,我刚看了MSDN并阅读: HRESULT是一个32位值,分为三个不同的字段:严重性代码,设施代码和错误代码。 严重性代码指示返回值是表示信息,警告还是错误。 设施代码标识负责该错误的系统区域。 所以我的最终问题是,我如何确保捕获该特定exception? 或者我如何从HResult获取错误代码? 提前致谢。

托管的无Reg COM服务器将无法激活

我开始使用一个非常复杂的客户端和服务器系统,带有COM引用和其他东西,我一直在减少直到我意识到我甚至无法获得Microsoft示例代码来管理托管COM服务器的免注册COM激活用C#编写。 服务器代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices.ComTypes; using System.Runtime.InteropServices; using System.ComponentModel; namespace ClassLibrary1 { [Guid(“A7AC6D8C-FF17-4D2C-A3B1-2C8690A8EA04”) ,ComVisible(true)] public interface IClass1 { [DispId(1)] string DummyFunction(string inputValue); } [Guid(“81723475-B5E3-4FA0-A3FE-6DE66CEE211C”), ClassInterface(ClassInterfaceType.None), ComDefaultInterface(typeof(IClass1)), ComVisible(true)] public class Class1 : IClass1 { public string DummyFunction(string inputValue) { return inputValue.Substring(0, 1) + ” Inserted ” + inputValue.Substring(1); } […]

无法转换类型exception的COM对象

我有以下代码: public void Test(IMyInterface iInterface) { iInterface.CallMethod ( ); } 哪个工作正常。 但是,如果我将代码更改为线程: private IMyInterface myInterface; public void Test(IMyInterface iInterface) { myInterface = iInterface; new Thread ( new ThreadStart ( CallInterfaceMethod) ).Start ( ); } public void CallInterfaceMethod ( ) { myInterface.CallMethod ( ) } 当我使用线程时,我收到exception: 无法将“System .__ ComObject”类型的COM对象强制转换为接口类型“IMyInterface”。 此操作失败,因为对于具有IID“{GUID}”的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口 但是应该支持接口就好了吗? 有人对这里发生的事情有任何想法吗?

在没有类型库的情况下使用C#中的COM dll

我需要使用很久以前在Delphi中开发的COM组件(dll)。 问题是:dll不包含类型库……并且.NET中的每个互操作function(例如,TlbImp)似乎都依赖于TLB。 这个组件已经在Delphi程序中使用了很多年没有问题,因为“使用Delphi的COM对象并不是什么问题,因为我们知道接口”(引用Delphi开发人员)。 有没有办法在没有TLB的情况下从c#中使用这个DLL? 我尝试使用DLL作为非托管,但它导出的唯一方法是DllUnregisterServer , DllRegisterServer , DllCanUnloadNow和DllGetClassObject 。 我知道我将要使用的类和函数的名称,如果这可以有任何帮助。 更新:我已经尝试过实施Jeff的建议,但是我收到了这个错误: “无法将’ComTest.ResSrvDll’类型的COM对象强制转换为接口类型’ComTest.IResSrvDll’。此操作失败,因为对于具有IID'{75400500-939F-11D4-9E44-0050040CE72C}的接口的COM组件上的QueryInterface调用’由于以下错误而失败:不支持此类接口(来自HRESULT的exception:0x80004002(E_NOINTERFACE))。“ 这就是我所做的: 我从Delphi中的一个人那里得到了这个接口定义: unit ResSrvDllIf; interface type IResSrvDll = interface [‘{75400500-939F-11D4-9E44-0050040CE72C}’] procedure clearAll; function ResObjOpen(const aClientID: WideString; const aClientSubID: WideString; const aResFileName: WideString; aResShared: Integer): Integer; {safecall;} … end; implementation end. 从这个我做了这个界面 using System.Runtime.InteropServices; namespace ComTest { [ComImport] [Guid(“75400500-939F-11D4-9E44-0050040CE72C”)] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IResSrvDll […]

如何以编程方式打开特定的bloomberg终端页面?

有没有可靠的方法以编程方式打开特定的bloomberg终端页面(例如“MSFT Equity”)? 我对任何建议和代码示例持开放态度: 通过参数中的bloomberg终端可执行文件和自动收录器的路径启动进程 彭博API DDE COM自动化 SendKeys (可被某些防病毒软件阻止) … 非常感谢

是否可以从.NET测试COM暴露的程序集?

我有一个.NET程序集,我通过tlb文件向COM公开,以及一个注册tlb的安装程序。 我已手动检查安装程序是否正常工作,并且COM客户端可以访问该库。 到现在为止还挺好… 但是,我正在尝试组合一些自动化系统测试,以检查安装程序是否正常工作。 作为其中的一部分,我已经在VM上自动安装,我现在想要对已安装的COM库进行一些调用以validation它是否正常工作。 我最初想过在VB6中编写一些测试,但我已经有了一大堆用C#编写的测试,它引用了.NET程序集。 我希望我可以更改这些以引用.tlb,但是当我在VS2008中尝试这个时出现错误: ActiveX类型库’blah.tlb’是从.NET程序集导出的,无法添加为引用。 有什么方法可以欺骗VS2008允许我添加这个引用,也许是通过编辑tlb文件? 谷歌搜索没有提出任何解决方案。 我发现的只是一篇Microsoft Connect文章,声明这是“按设计”: http : //connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx ?FeedbackID = 120882

.NET 4任务并行库可以使用COM对象吗?

这是“这是可能的,如果是这样,你能给我一个简单的例子,因为我找不到一个在线的吗?” 有点问题。 我有许多完全独立的(即“令人尴尬的并行”)进程,我想使用C#在.NET Framework 4中使用任务并行库并行运行。 其中一些过程需要使用可通过COM / OLE自动化访问的软件。 具体来说,有一个Parallel.Foreach()循环,它将任务从项目列表中分开,基本上在Parallel.Foreach中调用一个不同的函数来处理处理(因此这些函数中的一些使用COM库来工作)。 这可能吗? 谢谢。

可以直接从C#使用Profiling API吗?

我只想使用.NET Profiling API( ICorProfilerCallback等),但同时又不想处理C ++。 我一直在寻找一段时间,但没有在C#中找到任何例子,而是C#+ C ++,其中最有趣的部分是使用C ++编写的。