Tag: com interop

是否可以通过COM互操作转发代表?

我上课了: public class A { public delegate void SetTextDel(string value); public void Test() { SetTextDel setText = someInterface.SetText; icom.Set(setText); } } [ComVisible(true), Guid(“81C99F84-AA95-41A5-868E-62FAC8FAC263”), InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface Icom { void Set(Delegate del); } [ComVisible(true)] [Guid(“6DF6B926-8EB1-4333-827F-DD814B868097”)] [ClassInterface(ClassInterfaceType.None)] [ComDefaultInterface(typeof(Icom))] public class B : Icom { Set(Delegate del) { del.DynamicInvoke(“some text”); } } 我在Set(Delegate del)中获得了targetinvocationexception。 有没有更好的方法来转发委托作为参数? 或者我在这里犯了一些我没有看到的错误。 我想做的是将someInterface.SetText这个方法作为参数传递。 谢谢你的帮助。

为COM Interop构建.NET DLL时“访问注册表项被拒绝”

目标 : 使用COM interop构建一个C#DLL,由Delphi在另一个环境中调用 。 问题 :Windows阻止了我的构建,说我没有编辑注册表的权限。 语境: 我正在使用Windows 8,Visual Studio 2012,UAC已关闭。 我正在使用RGiesecke的DllExport来使用[DllExport]注释我想要导出为Dll的方法。 我在这里建议使用[ComVisible(true)] 。 我的解决方案平台目标是x86 我编辑了我的解决方案的构建属性,并检查了Build > Output > Register for COM Interop 我通过AssemblyInfo.cs编辑并启用[assembly: ComVisible(true)] 我用一个强有力的名字签署了我的大会 如果我不是作为管理员运行VS2012我得到此错误: Cannot register assembly ‘absolute\path\to\NameOf.dll’ access denied. Please make sure you’re running the application as administrator. Access to the registry key ‘HKEY_CLASSES_ROOT\NameOf.DllClass’ is denied Cannot register assembly ‘absolute\path\to\NameOf.dll’ […]

在C#中动态加载和使用COM对象

我有一个C#项目,如果它安装在客户端的机器上,我想访问MS outlook。 “访问前景”部分是通过引用Outlook COM对象并从那里开始完成的。 我的问题现在是“如果已安装”部分。 目前,我的项目没有在没有安装outlook的机器上编译,所以我假设我不得不引用outlook组件,而是在检测到outlook存在后动态加载和使用它,但我还没有找到了一种方法来做到这一点。 我是否正确,是否有人对如何做到这一点有任何暗示? 谢谢。 编辑:已解决。 根据Hans Passant在关于使用办公室PIA的一条评论中给出的建议,certificate是阻力最小的路径。 在我的办公室机器上获得PIA时遇到了一些困难,但是使用这个问题的接受答案就克服了这个问题。

使用本机/托管环境将无注册COM清单嵌入到C#dll中

我目前正在开发一个混合的本机/托管应用程序链,它使用免注册COM。 下图说明了这一点: 使用tlbimp.exe实用程序创建了C#包装器DLL。 这允许每个C#可执行文件访问COM DLL中的本机类型和方法。 COM DLL本身使用基于服务器的RegFree COM清单。 当基于客户端的RegFree COM清单嵌入在C#可执行文件中时,一切正常。 但是,我想将这些清单文件移动并统一到C#DLL中,这样可以显着简化版本信息的维护和同步。 由于Visual Studio不提供将清单文件嵌入C#类库的选项,因此我尝试使用清单工具(mt.exe)提取,修改和重新嵌入DLL的默认清单。 这似乎有效,因为当用mt查询时,C#DLL现在暴露了以下清单: 但是,可执行文件拒绝工作,每个人抱怨COM类工厂无法找到丢失的COM模块。 我在这里忽略了什么吗? 谢谢。

创建COM互操作类的实例

我试图使用C#在我的程序中打开CorelDRAW。 到目前为止,我已经能够通过引用适当的com库和调用来实现 CorelDRAW.Application draw = new CorelDRAW.Application(); draw.Visible = true; 但是,我希望我的程序能够与支持互操作的任何版本的CorelDRAW一起使用。 我试图在运行时使用reflection来加载互操作库,其中可以为正确的版本选择特定的dll。 从环顾四周,我尝试了以下内容。 string path = “Interop.CorelDRAW.dll”; Assembly u = Assembly.LoadFile(path); Type testType = u.GetType(“CorelDRAW.Application”); if (testType != null) { object draw = u.CreateInstance(“CorelDRAW.Application”); FieldInfo fi = testType.GetField(“Visible”); fi.SetValue(draw, true); } 该程序在u.CreateInstance…失败u.CreateInstance…失败,因为CorelDRAW.Application是一个接口,而不是一个类。 我还尝试用CorelDRAW.Application替换CorelDRAW.Application ,因为当我浏览Interop.CorelDRAW作为资源时可用,但随后u.getType…失败。 我怎样才能让它发挥作用? 谢谢!

关于COM Interop对象的思考

尝试为POCO创建一个Microsoft Office对象的映射器并找到它 // doesn’t work // returns an empty array where o is a RCW on an office object foreach(var pi in o.GetType().GetProperties() ) tgt.SetValue(rc, pi.GetValue(o, null)); 所以不得不求助于此 foreach(var field in tgt.GetFields() ){ var pv = o.InvokeMember(field.Name, System.Reflection.BindingFlags.GetProperty, null, o, null); i.SetValue(rc, pv); } 它现在有效,但想知道为什么RCW.GetProperties()在这里不起作用?

使用提升的权限进行调试时,Marshal.GetActiveObject(“Outlook.Application”)会抛出MK_E_UNAVAILABLE

当Visual Studio未作为管理员启动时,此代码在版本r调试中运行没有问题。 Marshal.GetActiveObject(“Outlook.Application”); 但是,当我以管理员身份启动Vs并在调试中运行相同的行时,我收到以下错误: System.Runtime.InteropServices.COMException Operation unavailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE)) 我怎样才能解决这个问题。

MethodImplAttribute(InternalCall,Runtime)对COM Interop接口的方法做了什么?

在Windows API Code Pack for .NET Framework中 ,COM Interop接口的许多方法都使用MethodImplAttribute进行修饰,例如: internal interface IShellItem { [PreserveSig] [MethodImpl( MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] HResult BindToHandler( [In] IntPtr pbc, [In] ref Guid bhid, [In] ref Guid riid, [Out, MarshalAs(UnmanagedType.Interface)] out IShellFolder ppv); MethodImplOptions.InternalCall值的文档说: 调用是内部的,也就是说,它调用在公共语言运行库中实现的方法。 MethodCodeType.Runtime文档说: 指定方法实现由运行时提供。 但是,如果我理解正确,这两种说法都是正确的。 根据MSDN, IShellItem在shell32.dll中实现 。 shell32.dll不是CLR的一部分。 有趣的是,并非所有方法都有MethodImplAttribute 。 IShellFolder没有, IShellLinkW没有, IShellLibrary没有, IPersistStream没有等等。 为什么MethodImplAttribute应用于某些COM Interop接口? 在这种情况下它意味着什么?它如何修改互操作的行为?

在运行时加载COM dll?

我正在编写Peachtree API的应用程序,它需要使用任何版本的API。 不幸的是,Peachtree 2011的dll无法与Peachtree 2010交互,反之亦然,即使两个dll存储在同一位置并使用完全相同的代码运行。 我以为我应该能够通过它的文件路径引用dll,将特定版本保留为false,将interop类型嵌入为false,并将本地复制为false,它只会使用机器具有的任何版本,但是当我得到错误时我这样做 – “调用的目标引发了exception。” 有没有办法尽快绑定dll,即使它是COM? 我可以提供您认为有用的代码示例,但它更多的是项目设置问题。 编辑:非常感谢你的帮助。 我在另一个人的问题上找到了我的解决方案并在此处发布。

Json.Net可以嵌入到可执行文件中吗?

我将Netwonsoft.Json库的’Embed Interop Types’属性设置为true ,它返回一个错误: Cannot embed interop types from assembly ‘c:\path\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll’ because it is missing either the ‘ImportedFromTypeLibAttribute’ attribute or the ‘PrimaryInteropAssemblyAttribute’ attribute c:\path\packages\Newtonsoft.Json.9.0.1\lib\net45\Newtonsoft.Json.dll 它看起来像在Newtonsoft.Json库中寻找缺少的引用,但我不完全确定。 是否有可能将Json.Net嵌入到可执行文件中?