Tag: com interop

.NET互操作来回复制数组数据,还是固定数组?

我有这个COM方法签名,在C#中声明: void Next(ref int pcch, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 0)] char[] pchText); 我称之为: int cch = 100; var buff = new char[cch]; com.Next(ref cch, buff); .NET互操作层是否首先将整个数组复制到临时的非托管内存缓冲区,然后将其复制回来? 或者数组是否自动固定并通过引用传递? 为了尝试,我在COM对象(C ++)中做到了这一点: *pcch = 1; pchText[0] = L’A’; pchText[1] = L’\x38F’; // ‘Ώ’ 当我在返回时检查C#中的buff[1]时,我确实得到’Ώ’ 。 但我不认为这是一个强有力的证据,certificatearrays固定,而不是来回复制。

在C#中创建GUI并在VBScript中调用

我尝试用C#制作一个带有COM-visible的ActiveX。 它是一个Windows窗体。 我成功地将其构建为dll ActiveX,然后我编写了一个VBScript代码来调用它。 从那之后出现但消失了。 我不知道为什么@@这是我的代码: C#代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using Microsoft.Win32; using System.Reflection; namespace ActiveXTestLibrary { [ProgId(“ActiveXTestLibrary.UserControl”)] [ClassInterface(ClassInterfaceType.AutoDispatch)] [ComVisible(true)] public partial class UserControl1 : Form { public UserControl1() { InitializeComponent(); } [ComVisible(true)] public void Hello() { this.Show(); } private void radButton1_Click(object […]

如何使用COM将字符串从c#传递给c ++?

当我尝试从c ++调用c#代码时,我按照本文的说明操作 http://support.microsoft.com/kb/828736 我的c#的一部分是: [Guid(“6A2E9B00-C435-48f8-AEF1-747E9F39E77A”)] public interface IGameHelper { void getInfo(out string result); } public class GameHelper : IGameHelper { void getInfo(out string result) { result = new StringBuilder().Append(“Hello”).ToString(); } } 我的c ++代码的一部分: #import “../lst/bin/Release/LST.tlb” named_guids raw_interfaces_only using namespace LST; using namespace std; … HRESULT hr = CoInitialize(NULL); IGameHelperPtr pIGame(__uuidof(GameHelper)); BSTR ha = SysAllocString(NULL); pIGame->GetInfo(&ha); […]

COM Interop与VB6和C#

我正在编写一个将由VB 6程序使用的C#COM对象。 这应该不是什么大问题,但是,对COM对象的VB6调用传入VB控件(在本例中为TextBox)。 程序期望COM对象更改控件的Text属性。 不幸的是,我必须坚持这个界面,因为我正在处理其他人遗留代码。 如何设置传递的TextBox的属性? 我只是创建一个具有Text属性的接口并将input转换为该接口吗? 这有可能吗? 如果我需要澄清,请告诉我。 注意:我打算在以下代码中省略COM声明。 // C# COM Object Interface public interface IObj { // This function must receive the argument of type object. void Test(object input); } // C# COM Object Implementation public class Obj : IOjb { // A VB6 TextBox is passed into here, // expecting a […]

Regasm和Com Interop假阴性

我试图通过COM公开我们的库,但似乎比实际问题更多地对抗工具。 无论我如何编写COM暴露类,我都会收到警告:“XXX.dll不包含任何可以为COM互操作注册的类型”(在项目属性中将项目标记为注册为COM互操作)。 即使是下面的简单类(作为已签名并标记为ComVisible(false)的程序集中的唯一类)仍然警告仍然存在: [Guid(“77699130-7D58-4d29-BE18-385871B000D1”)] [ComVisible(true)] public interface IExample { string GetText(); void SetText(string text); } [Guid(“F91E5EE1-D220-43b5-90D1-A48E81C478B7”)] [ComVisible(true)] public class Example : IExample { private string m_text = “default text”; public string GetText() { return m_text; } public void SetText(string text) { m_text = text; } } 我试图从输出的命令行运行regasm,很高兴地说“类型注册成功”。 但是,使用/ verbose开关运行时不会显示额外的信息(我似乎记得它列出了名称或者只列出了已注册类型的数量)。 还尝试用/ regfile开关运行regasm来生成一个regfile,它生成这个: [HKEY_CLASSES_ROOT\ComExample.Example] @=”ComExample.Example” [HKEY_CLASSES_ROOT\ComExample.Example\CLSID] @=”{F91E5EE1-D220-43B5-90D1-A48E81C478B7}” […]

我应该如何声明Microsoft.Office.Interop.Excel.Worksheet,以便我可以在C#中关闭它?

我很难确保我的COM对象正在关闭,所以我不会在后台运行EXCEL.EXE进程。 我已经知道声明的双点和链接是坏的,因为这可能会让COM对象徘徊。 有谁知道如何修复这行代码,以便我可以正确关闭并释放工作表COM对象? worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Sheets[strName]; 编辑:我已经尝试使用app.Quit()当我完成执行此行以关闭打开的Excel对象,但这不起作用。 如果我在此行之前调用它,则app.Quit()有效。

C#中_bstr_t的等价物是什么

我正在开发一个项目,我需要将C ++代码转换为C#。 我在代码中遇到_bstr_t我想知道C#中的等价物。

COMException(0x800401E3):具有计划任务的操作不可用(来自HRESULT的exception:0x800401E3(MK_E_UNAVAILABLE))

在网上搜索没有成功,这是我的问题。 我有一项任务,我想安排从outlook检索电子邮件的附件并提取数据。 当我手动启动任务时,它工作正常,但每当我尝试通过计划任务启动它时,它都会失败并显示错误: COMException(0x800401E3):操作不可用(来自HRESULT的exception:0x800401E3(MK_E_UNAVAILABLE)) 当程序尝试检索或创建Outlook实例时,会发生以下情况: private Application GetApplicationObject() { Application application = null; if (Process.GetProcessesByName(“OUTLOOK”).Any()) { application = Marshal.GetActiveObject(“Outlook.Application”) as Application; } else { application = new Application(); } return application; } 我尝试了几种方法(批处理文件,.exe文件,程序中的参数)但它们都失败了。 它是使用用于手动启动任务的相同帐户启动的。 有人能帮我吗 ? 任何帮助,将不胜感激! 干杯!

用于托管进程内服务器的自定义COM类工厂

我正在寻找以MkParseDisplayName/BindToObject 方式为托管类库实现自定义COM激活逻辑。 这样,从VB创建对象可能如下所示: obj = GetObject(“clsid:12341234-1234-1234-1234-123412341234:!UniqueObjectId”) 这对于一个进程外服务器(使用CoRegisterClassObject )来说不是问题。 但是,对于进程内服务器,我需要更改DllGetClassObject的实现,这通常由mscoree.dll提供。 这有可能吗? 我看到的唯一其他选项是创建一个C#单例对象作为类工厂并在其上实现IParseDisplayName 。 从理论上讲,这样的单例也可以使用CoRegisterClassObject(CLSCTX_INPROC_SERVER)注册自定义的IClassFactory类对象,但CoRegisterClassObject(CLSCTX_INPROC_SERVER) ,单例本身都需要首先实例化。

错误激活IInterceptor …只能通过COM?

TL; DR: Kernel.Get在从.net / WPF应用程序调用时起作用,但是当从VB6应用程序调用时,会发生内部ActivationException (在TargetInvocationException内部)。 WTH? 这是对这个问题的一个跟进,我在这个问题中配置了一个具有Ninject约定的抽象工厂,这样我就不需要实际实现一个,Ninject工厂扩展负责生成一个动态。 这很好用……直到我需要从VB6代码运行我的库。 _kernel.Bind(t => t.FromAssemblyContaining(typeof(ViewModelBase)) .SelectAllInterfaces() .EndingWith(“ViewFactory”) .BindToFactory()); 一旦我从VB6代码调用应用程序上的任何内容,如果我将依赖项的解析包装在try / catch块中,我将使用内部ActivationException捕获TargetInvocationException : 使用IInterceptor Provider的条件隐式自绑定激活IInterceptor时出错返回null。 激活路径: 3)将依赖性IInterceptor注入到IViewFactoryProxy类型的构造函数的参数中 2)将依赖IViewFactory注入到MsgBox类型的构造函数的参数viewFactory中 1)请求IMsgBox 建议: 1)确保提供程序正确处理创建请求。 我没有引用Ninject.Interception扩展(此时)。 奇怪的是,如果不是启动VB6,我在调试时启动沙盒WPF测试应用程序,我没有得到任何ActivationException ,一切都像魅力一样。 VB6代码死于automation error -2146232828 (80131604) ,谷歌没有产生任何结果,但我猜它与抛出的TargetInvocationException 。 就.net代码而言, 它只是起作用 :如果我从WPF客户端编写应用程序,我可以在MsgBox类构造函数中查看并看到IViewFactory参数对IViewFactory感到满意; 如果我从VB6 ActiveX DLL编写应用程序(我还创建了一个VB6 EXE进行测试,并且与DLL相同),它会爆炸。 UPDATE 我删除了通用抽象工厂,我不再收到此错误。 因为我不想写工厂,所以我采取了一些更紧密的耦合,我可以忍受。 现在我想知道为什么会这样!