Tag: com interop

将字符缓冲区从.NET传递给COM并将其更新回来

我有从C#调用以下COM方法,它在提供的缓冲区pchText (不一定是零终止)中返回一个字符串,并在pcch复制字符数: HRESULT Next([in, out] long* pcch, [out, size_is(*pcch)] OLECHAR* pchText); 如何为互操作定义C#签名? 到目前为止,我试过这个: void Next(ref int pcch, [MarshalAs(UnmanagedType.LPWStr, SizeParamIndex = 0)] System.Text.StringBuilder pchText); 它似乎工作,但我不确定SizeParamIndex是否对StringBuilder有任何影响。

通过C#的COM互操作提高正VB样式错误代码

我有一个在VB6中创建的基础库,它公开了一个在许多应用程序中使用的标准COM接口。 这也暴露了许多错误代码常量,与Err.Raise用于指示某些条件。 Public Enum IOErrors IOErrorBase = 45000 IOErrorConnectionFailed IOErrorAuthFailed IOErrorNotConnected IOErrorInvalidPortDirection IOErrorGettingValue IOErrorNoValueYet End Enum 经过10年,我们正在创建实现相同接口集的C#对象,并希望以调用应用程序识别它们的方式抛出exception。 我只能找到两个相关的类, Win32Exception和COMException 。 抛出Win32Exception((int)IOErrors.IOErrorConnectionFailed, “Connect failed”)正确传递消息,但忽略错误代码, Err.Number为&H80004005 。 抛出COMException(“Connect failed”, IOErrors.IOErrorConnectionFailed)导致调用应用程序中没有错误被COMException(“Connect failed”, IOErrors.IOErrorConnectionFailed) ,大概是因为错误代码不是HRESULT而且是肯定的,这意味着成功。 TL; DR如何从C#中抛出exception,以便COM互操作将其转换为上面的一个已识别(正)错误代码?

尝试在C#中构建一个可以从VB5 / 6引用和使用的COM组件

我试图看看我是否可以在C#(.NET 4)中构建一个COM组件,我可以从VB5程序(提示嘲讽性评论)中使用它来访问Web服务。 按照我在MSDN和CodeProject上找到的所有说明,如下所示: 在C#中构建COM对象 示例COM类(C#编程指南) 我写了以下内容: [Guid(“7A715F02-D349-45DC-B0AE-9925FD3B943C”)] public interface ARCOM_Interface { [DispId(1)] string GetServiceResponse(); } [Guid(“5130F041-619E-41F9-84B6-8332642228F6”) , InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ARCOM_Events { } [Guid(“0A77754F-34CF-4E0E-AAC2-85FD686758E0”) , ClassInterface(ClassInterfaceType.None) , ComSourceInterfaces(typeof(ARCOM_Events))] [ComVisible(true)] public class ARCOM_Class : ARCOM_Interface { public string GetServiceResponse() { string response = string.Empty; ARWebService.ARWebService svc = new ARWebService.ARWebService(); response = svc.PingMeBack(); return response; } } […]

在C#/ .NET 4.0中新的NoPIA和Type Equivalencefunction是否意味着不再需要Microsoft.mshtml.dll

我正在维护一个基于WPF的应用程序,它包含一个基于WinForms的WebBrowser控件,该控件基于IE Web浏览器控件。 当我们部署时,我们还必须提供Microsoft.mshtml.dll并为ClickOnce发布过程做一些自定义配置,以便让事情发挥作用。 我很好奇,使用C#4.0中新的NoPIA和Type Equivalencefunction以及动态类型function,我们可以期望如果我们升级它,我们可以删除对Microsoft.mshtml.dll程序集的依赖吗? 如果是这样,这不仅会减少我们部署的规模,还会简化我们的发布过程。 我的理解是,我们应该能够将通常自动生成的类型嵌入到COM类型的额外程序集中,例如Visual Studio的MapPoint控件。 我不知道这是否也适用于Microsoft.mshtml.dll ,甚至在最简单的情况下它是如何完成的。 如果有人可以解释这些新function对依赖COM互操作的项目的实际影响,特别是Microsoft.mshtml.dll程序集,那将对我有很大帮助。

COM Interop,RPC服务器在c#中不可用

我正在使用COM Interop,我正在从interop dll实例化COM类对象所以,几次对象被成功实例化并进行远程过程调用没有任何问题,但有时它抛出一个exception,如RPC Server是不可用的。 我正在使用的COM组件是用VB编写的,我在c#中使用该组件。 那么,任何人都可以告诉我问题的可能原因(RPC服务器不可用)和解决此问题的方法。 我现在对这个问题很无奈。 所以,如果你能帮助我,请转发

使用C#打开Word文档(.doc)会因文件阻止设置而导致COMException

我正在尝试使用C#/ .NET和Microsoft.Office.Interop.Word打开一个非常旧的(二进制)Word文件。 每当我尝试使用下面的代码段打开此文件时,它都会因为COMException而失败,告诉我“您正在尝试打开信任中心中的文件阻止设置阻止的文件类型。” 这也常见于在MS Word中打开相同文件时发生,但在调整信任中心中找到的设置后,现在可以正常工作。 但是,我仍然无法使用C#打开文件。 有谁知道VS2010是否缓存这些设置,或者在某处使用自己的设置? 我还尝试使用相同的代码片段创建一个新项目(在修复Word中的设置之后)以查看是否有帮助,但事实并非如此。 Word.Application app; string file = “”; app = new Word.Application(); try { app.Documents.Open(file); } catch (COMException e) { string s = e.Message; }

Marshal.GenerateGuidForType(Type)和Type.GUID之间有什么区别?

Type classType = typeof(SomeClass); bool equal = Marshal.GenerateGuidForType(classType) == classType.GUID; 我没有找到一个失败的情况。 那么为什么以及何时应该使用Marshal方法而不是简单地获取GUID属性?

我应该使用.NET应用程序部署Interop.x.dll文件吗?

我们有一个.NET应用程序,它使用不同DLL中的COM对象,也用于我们应用程序的VB6部分。 在引用COM库时,Visual Studio 2012会创建一个Interop.x.DLL并引用它。 我应该从构建计算机分发Interop.x.DLL还是使用某些.NET命令行工具重新生成它? 什么工具? 部署引用COM的.NET应用程序的最佳实践是什么?

在C#中使用VB6字符串数组

我有(遗留)VB6代码,我想从C#代码中使用。 这有点类似于这个问题 ,但它指的是从VB6传递一个消耗C#dll的数组。 我的问题恰恰相反。 在VB中,一个dll中有一个接口,另一个中有一个实现。 接口: [ odl, uuid(339D3BCB-A11F-4fba-B492-FEBDBC540D6F), version(1.0), dual, nonextensible, oleautomation, helpstring(“Extended Post Interface.”) ] interface IMyInterface : IDispatch { [id(…),helpstring(“String array of errors.”)] HRESULT GetErrors([out, retval] SAFEARRAY(BSTR)* ); }; cMyImplementationClass中的实现(片段): Private Function IMyInterface_GetErrors() As String() If mbCacheErrors Then IMyInterface_GetErrors = msErrors End If End Function 我用tlbimp.exe包装了这两个dll,并尝试从C#调用该函数。 public void UseFoo() { cMyImplementationClass foo; […]

在基于.NET的COM对象的CoCreateInstance期间挂起的应用程序

我有一个C ++ DLL,它创建一个在.NET中实现的COM对象的实例。 在许多情况下,这工作正常,但在某些情况下,它会挂起应用程序,我看到它停留在下面的调用堆栈(这只是我的DLL代码级别下面的部分): ntdll.dll!_NtAlpcSendWaitReceivePort@32() rpcrt4.dll!LRPC_CASSOCIATION::AlpcSendWaitReceivePort(unsigned long,struct _PORT_MESSAGE *,struct _ALPC_MESSAGE_ATTRIBUTES *,struct _PORT_MESSAGE *,unsigned long *,struct _ALPC_MESSAGE_ATTRIBUTES *,union _LARGE_INTEGER *) rpcrt4.dll!LRPC_BASE_CCALL::DoSendReceive(void) rpcrt4.dll!LRPC_BASE_CCALL::SendReceive(struct _RPC_MESSAGE *) rpcrt4.dll!_I_RpcSendReceive@4() rpcrt4.dll!_NdrSendReceive@8() rpcrt4.dll!@NdrpSendReceive@4() rpcrt4.dll!_NdrClientCall2() combase.dll!ServerAllocateOXIDAndOIDs(void * hServer, void * phProcess, unsigned __int64 * poxidServer, unsigned long cOids, unsigned __int64 * aOid, unsigned long * pcOidsAllocated, const tagOXID_INFO * poxidInfo, tagDUALSTRINGARRAY * pdsaStringBindings, […]