Tag: com interop

在C#中的类上面出现的Guid属性是什么?

我最近选择了一些C#代码,其中一个类上面有一个Guid属性。 我不明白这是什么或它用于什么。 有人可以给我一个简要的概述,或者只是指向一些提供更多相关信息的文章? 谢谢!

将类似索引器的属性暴露给COM

我有现有的COM界面。 我不想创建一个将新接口公开为COM(带有新GUID)的.net程序集,但接口的结构必须相同。 如何创建一个公开此接口的.net类(C#)? [ odl, uuid(1ED4C594-DDD7-402F-90DE-7F85D65560C4), hidden, oleautomation ] interface _IFlashPhase : IUnknown { [propget] HRESULT _stdcall ComponentName( [in] short i, [out, retval] BSTR* pVal); [propput] HRESULT _stdcall ComponentName( [in] short i, [in] BSTR pVal); [propget] HRESULT _stdcall ComponentMolePercent( [in] short i, [out, retval] double* pVal); [propput] HRESULT _stdcall ComponentMolePercent( [in] short i, [in] double […]

需要ClassInterfaceType.None?

从MSDN中得不到以下内容: ClassInterfaceType.None 表示没有为该类生成类接口。 如果没有显式实现接口,则该类只能通过IDispatch接口提供后期绑定访问。 这是ClassInterfaceAttribute的推荐设置。 使用ClassInterfaceType.None是通过类显式实现的接口公开function的唯一方法。 COM可见性必须[ComVisible(true)]吗?

当从Delphi传递给C#作为函数参数时,空字符串变为null

我有一个原生的Delphi exe,它通过COM interop调用C#dll。 以下是演示此问题的最简单案例: delphi: IClass1 = interface(IDispatch) [‘{B29BAF13-E9E4-33D7-9C92-FE28416C662D}’] function Test(const aStr: WideString): WideString; safecall; end; var obj: IClass1; s: string; begin obj := CoClass1.Create as IClass1; s := obj.Test(”); // Returns ‘[null]’ end; C#: [ComVisible(true)] public interface IClass1 { string Test(string aStr); } [ComVisible(true)] public class Class1 : IClass1 { public string Test(string aStr) […]

将C ++ string / wchar_t *转换为C#字符串?

问题:我需要从C ++可执行文件中调用C#dll。 我使用COM,它适用于int,long和bool。 但我不能得到一个字符串…… IDL文件说它是BSTR,但是我无法正确传递它,也没有检索到它。 我尝试使用wchar_t *并像使用VB6一样使用sysalloc,但这似乎不起作用。 有谁知道怎么回事?

COM方法,Char类型和CharSet

这是我之前的问题的后续问题: .NET互操作是来回复制数组数据,还是固定数组? 我的方法是COM接口方法(而不是DllImport方法)。 C#签名如下所示: void Next(ref int pcch, [In, Out, MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char [] pchText); MSDN 说 : 当默认情况下具有Unicode格式的托管Char类型传递给非托管代码时,interop编组器会将字符集转换为ANSI。 您可以将DllImportAttribute属性应用于平台调用声明,将StructLayoutAttribute属性应用于COM互操作声明,以控制封送的Char类型使用的字符集。 另外,@ HansPassant在他的回答中说 : char []不能作为LPWStr封送,它必须是LPArray。 现在CharSet属性起作用,因为你没有指定它,char []将被编组为8位char [],而不是16位wchar_t []。 编组的数组元素大小不同(它不是“blittable”),因此编组器必须复制数组。 非常不受欢迎,特别是考虑到您的C ++代码需要wchar_t。 在这个特定情况下,一个非常简单的方法是在数组中没有得到任何回报。 如果通过复制对数组进行封送处理,则必须明确告诉编组程序在调用后需要将数组复制回来。 您必须在参数上应用[In,Out]属性。 你会得到中国人。 我找不到CharSet的模拟(通常与DllImportAttribute和StructLayoutAttribute ),它可以应用于COM接口方法。 尽管如此,我的输出并没有“中国人”。 一切似乎工作正常,我从COM得到正确的Unicode字符。 这是否意味着Char总是被解释为COM方法互操作的WCHAR ? 我找不到任何确认或否认这一点的文件。

什么是我用COM互操作得到的`Object `类型?

我做C#excel互操作。 我从C#调用宏,我期待对象的数组。 我能够从返回二维数组的宏中获得二维对象数组。 但是,其他(第三方)宏应该返回一维数组。 我无法使(object[])xlApp.Run(…)工作(它抛出exception),调试器中的类型信息表示结果是Object[*]类型。 来自exception的实际消息是 Unable to cast object of type ‘System.Object[*]’ to type ‘System.Object[]’. 什么是Object[*]类型,如何从中检索一维数组? 编辑 :我想到这可能意味着SAFEARRAY的VARIANTS。 但随后出现了两个问题:为什么二维数组一切正常? 如何将SAFEARRAY转换为C#数组?

从BS#传递BSTR到COM函数的惯例(COM互操作)

我正在编写一个用C ++编写COM的API,还编写一个在C#中使用这个API的程序。 我的问题是关于将BSTR传递给COM函数时的BSTR内存管理语义。 说我的IDL看起来像: HRESULT SomeFunction([in] BSTR input); 目前这个function实现如下: HRESULT SomeFunction(BSTR input) { // Do stuff …, then: SysFreeString(input); } 当我用类似SomeFunction(myString)类的东西从C#调用它时,C#会生成这样的东西(伪代码): myString = SysAllocString(“string”); SomeFunction(myString); 或者更喜欢这样: myString = SysAllocString(“string”); SomeFunction(myString); SysFreeString(myString); 也就是说,C#是否释放了它生成的BSTR来编组COM接口,还是应该在我的函数中释放它? 谢谢!

如何让LINQPad转到Dump()系统.__ ComObject引用?

我正在使用LINQPad来快速开发小型ArcObjects (一个基于COM的ESRI ArcGIS软件库)应用程序,并且已经成功地将它用于Dump()我从.NET初始化的COM对象的属性,但是从现有COM对象获取的COM对象只是作为System.__ComObject引用转储,这不是特别有用: 这个帮助主题解释了为什么会发生这种情况,我认为我理解,但是想知道解决这种行为有哪些选择,特别是在使LINQPad(甚至)更强大的环境中。 有趣的是,Visual Studio的调试器能够显示这些对象的属性,甚至是值类型的值: Visual Studio使用什么机制来实现这种内省,为什么LINQPad的Dump方法不会这样做呢? 编辑:请参阅有关VS如何执行此操作的相关问题: Visual Studio的调试器/交互式窗口如何在.NET中转储COM对象的属性? ArcObjects .NET SDK包含带有RCW的PIA,每个CoClass可以通过COM接口实现,所以我认为应该可以以编程方式包装这些对象。 作为一种解决方法,我在LINQ查询中成功使用Marshal.CreateWrapperOfType()来强制LINQPad在我碰巧知道应该使用哪个CoClass时转储对象的属性。 当然,这只能正确转储值类型属性 – 任何基于COM的引用类型属性仍然报告为System.__ComObject ,因此正确的解决方案必须以递归方式工作以获取那些包装。 在之前的一个问题中,我了解到CoClass可以在运行时确定它是否实现了IPersist ,这是ArcObjects的很大一部分。 我可以以某种方式使用这种技术或其他技术自动将System.__ComObject从PIA System.__ComObject为适当的RCW吗? 如果是这样,我如何在LINQPad中实现它,例如通过提供ICustomMemberProvider实现? 这可以是递归的,这样也可以包装也是COM对象的属性吗? 我正在使用面向.NET 4.0的LINQPad 4.x,但我也对支持LINQPad 2.x感兴趣(因此,首选适用于.NET 3.5和.NET 4.0的解决方案,但这不是必需的)。 更新:我已经弄清楚我的问题的第一部分是如何使用IPersist.GetClassID返回的CLSID在其RCW中包装System.__ComObject 。 请参阅此相关问题和我正在使用的代码的答案 。 我仍然想知道如何将其用于LINQPad的Dump方法。

w3wp.exe中发生未处理的win32exception

尝试加载ASP.NET MVC网站时出现以下exception: w3wp.exe中0x07070a91处的未处理exception:0xC0000005:访问冲突读取位置0x00000000。 Visual Studio实时调试器打开,我在调试器中看到的唯一信息是: 调用堆栈位置: MSVBVM60.DLL!06c00a91() 该网站使用了一些COM对象,一切正常,直到上周。 这个问题突然出现了。 这是Windows事件查看器的错误日志: 错误应用程序名称:w3wp.exe,版本:7.5.7601.17514,时间戳:0x4ce7a5f8 错误模块名称:MSVBVM60.DLL,版本:6.0.98.15,时间戳:0x4a5bda6c exception代码:0xc0000005 故障偏移:0x00030a91 错误进程id:0x1a0 错误应用程序启动时间:0x01cd31fcb47f66d8 错误的应用程序路径:C:\ Windows \ SysWOW64 \ inetsrv \ w3wp.exe 错误模块路径:C:\ Windows \ system32 \ MSVBVM60.DLL 报告ID:f5db0ae3-9def-11e1-ad79-005056c00008 您有什么建议可以帮助解决这个问题吗? 编辑:我设法解决了问题,现在一切正常。 该解决方案涉及调整自定义dll所需的一些注册表设置,以便正常运行。 所以这个问题实际上并没有突然出现,我只是没有意识到一些注册表值被修改,导致一个com dll崩溃。