Tag: com

.NET WebBrowser控件是否可以使用IE9?

我意识到这是一个早期发布和不稳定。 我不会梦想在任何其他项目中换掉IE9的默认webbrowser控件,但在这种情况下我特别需要IE9与其他版本进行比较。 我想让.NET WebBrowser控件使用IE9而不是机器上的默认IE版本。 我完全控制了机器,因此破解系统文件或其他可能需要的东西都没有问题。 通常,这可以通过将更新安装到IE来实现,但在IE9的情况下,它安装了一个单独的应用程序,使当前版本的IE保持不变。 这意味着WebBrowser控件继续使用当前版本(这是有道理的,并且是MS的明智之举,因为IE9仍处于开发阶段)。 但在我的(边缘)情况下,我需要WebBrowser控件来使用IE9。 是否可以在.NET表单应用程序中嵌入IE9? 编辑 随着Hans Passant的帮助,我得到了更多。 在IE9的prog文件目录中发生了一些非常有趣的事情。 有一个名为“iepreview.exe.local”的目录,当删除时,会使IE9预览应用程序使用IE8(使用acid3测试检查)。 不是我想要的,但我想知道这是否是我可以根据我的需要进行的某种重定向。 编辑2 我已经尝试将.local hack应用于我的iexplore.exe和我的.NET应用程序的副本,我注意到其他有趣的东西 – 两个应用程序都开始使用IE7而不是IE8(我的IE版本)或IE9。 这可能是iexplore尝试使用IE9然后再回到IE7? 看起来很奇怪它甚至可以使用IE7,但这是它开始使用的useragent字符串。

C# – 挂钩到现有的COM对象

假设我们有一个现有的进程(或应用程序)从ocx文件调用COM对象,例如“MyCOMLibrary.ocx”。 有没有办法编写一个C#库来完全复制ocx文件? 这样原始应用程序可以调用您的C#代码而不是原始COM对象? 当然,您必须使用相同的CLSID和ProgID作为原始ocx。 假设没有涉及签名,例如.Net世界中的SNK。 此外,是否有任何工具可以实现自动化? 接受ocx的东西并使用要实现的方法吐出C#文件。 编辑:我想补充说原始应用程序是VB6,并且根本不使用.Net。 他们最有可能将ocx加载为VB6 app(ProgId或Guid)。 这会导致任何问题吗? 完全重写ocx我们也没有问题 – 我们很可能只返回所有方法的成功错误代码,并且只使用我们的情况所需的方法/事件。 编辑:你会认为这不会太难实现。 我们可以创建一个可以替换旧ocx的VB6 ocx文件,并将所有调用传递给.Net程序集吗? 编辑:我尝试使用以下开源库: EasyHook 但似乎这个问题应该仍然可行。 VB6似乎以防止挂钩的方式加载COM对象。 我没有看到使用EasyHook在类/接口或类的构造函数上挂钩实例方法的方法。

如何在inheritance自另一个COM接口的C#上声明和实现COM接口?

我试图了解从C#代码实现COM接口的正确原因是什么。 当接口不从其他基接口inheritance时,它很简单。 像这个: [ComImport, Guid(“2047E320-F2A9-11CE-AE65-08002B2E1262”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IShellFolderViewCB { long MessageSFVCB(uint uMsg, int wParam, int lParam); } 然而,当我需要实现从其他COM接口inheritance的接口时,事情开始变得疲惫不堪。 例如,如果我实现inheritance自IPersistFolder的IPersistFolder2接口,它通常依赖于C#代码从IPersistFolderinheritance: [ComImport, Guid(“0000010c-0000-0000-C000-000000000046”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersist { void GetClassID([Out] out Guid classID); } [ComImport, Guid(“000214EA-0000-0000-C000-000000000046”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersistFolder : IPersist { void Initialize([In] IntPtr pidl); } [ComImport, Guid(“1AC3D9F0-175C-11d1-95BE-00609797EA4F”), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] public interface IPersistFolder2 : IPersistFolder […]

COM互操作是否尊重.NET AppDomain边界以进行程序集加载?

这是核心问题:我有一个在单独的AppDomain中使用COM互操作的.NET应用程序。 COM的东西似乎是将程序集加载回默认域,而不是从中调用COM内容的AppDomain。 我想知道的是:这是预期的行为,还是我做错了导致这些COM相关的程序集被加载到错误的AppDomain中? 请参阅以下情况的更详细说明…… 该应用程序由3个程序集组成: – 主EXE,应用程序的入口点。 – common.dll,只包含一个接口IController(采用IPlugin风格) – controller.dll,包含一个实现IController和MarshalByRefObject的Controller类。 此类完成所有工作并使用COM interop与另一个应用程序进行交互。 主要EXE的相关部分如下所示: AppDomain controller_domain = AppDomain.CreateDomain(“Controller Domain”); IController c = (IController)controller_domain.CreateInstanceFromAndUnwrap(“controller.dll”, “MyNamespace.Controller”); result = c.Run(); AppDomain.Unload(controller_domain); common.dll只包含以下两件事: public enum ControllerRunResult{FatalError, Finished, NonFatalError, NotRun} public interface IController { ControllerRunResult Run(); } controller.dll包含这个类(也调用COM互操作的东西): public class Controller: IController, MarshalByRefObject 首次运行应用程序时,Assembly.GetAssemblies()看起来像预期的那样,在两个AppDomain中都加载了common.dll,并且只将controller.dll加载到控制器域中。 在调用c.Run()之后,我看到与COM互操作相关的程序集已加载到默认的AppDomain中,而不是在发生COM互操作的AppDomain中。 为什么会发生这种情况? 如果你有兴趣,这里有一些背景知识: 最初这是一个1 AppDomain应用程序。 它与之接口的COM东西是一个服务器API,在长时间使用时不稳定。 […]

为COM Interop公开dll

我以为我知道怎么做,但显然不是这样,我会感激一些帮助! 我无法让我的dll注册,所以我可以在VBS或其他地方实例化它。 我编写了以下示例类,选中“Make assembly COM Visible”,选中“Register for COM Interop”,然后构建它。 当我尝试从VBS实例化它时,我得到“Activex组件无法创建对象”错误。 这是类代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Smurf { public class Pants { public string Explode(bool Loud) { string result; if (Loud) result = “BANG”; else result = “pop”; return result; } } } ……这是VBS: Dim a Set a = CreateObject(“Smurf.Pants”) msgbox(“ok”) […]

如何在本机.NET类中包装COM对象?

我在.NET(C#)中使用了广泛的现有COM API(可能是Outlook,但它不是)。 我已经通过在Visual Studio中添加“COM Reference”来完成此操作,因此所有“魔法”都是在幕后完成的(即,我不必手动运行tlbimp )。 虽然现在可以从.NET“轻松”使用COM API,但它不是非常友好的.NET。 例如,没有generics,事件很奇怪,像IPicture等奇怪。所以,我想创建一个使用现有COM API实现的本机.NET API。 一个简单的第一次传球可能是 namespace Company.Product { class ComObject { public readonly global::Product.ComObject Handle; // the “native” COM object public ComObject(global::Product.ComObject handle) { if (handle == null) throw new ArgumentNullException(“handle”); Handle = handle; } // EDIT: suggestions from nobugz public override int GetHashCode() { return Handle.GetHashCode(); } […]

检索具有CLSID错误:8000401a的组件的COM类工厂

从上次这么多次我得到以下错误。因为我使用Microsoft Word dll创建进一步附加到邮件的word文件。 Server Error in ‘/’ Application. Retrieving the COM class factory for component with CLSID {000209FF-0000-0000-C000-000000000046} failed due to the following error: 8000401a. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the […]

将.NET事件暴露给COM?

我一直在尝试向VBA客户端公开和触发事件。 到目前为止,在VBA客户端,事件已暴露,我看到方法事件处理方法添加到我的模块类,但VBA事件处理方法不会触发。 出于某种原因,调试事件时为null。 同步修改我的代码也没有帮助。 为了记录,我已经检查了其他SO问题,但他们没有帮助。 任何好的答案将不胜感激。 [ComVisible(true)] [Guid(“56C41646-10CB-4188-979D-23F70E0FFDF5”)] [ClassInterface(ClassInterfaceType.None)] [ComSourceInterfaces(typeof(IWebEvents))] [ProgId(“MyAssembly.MyClass”)] public class MyClass : ServicedComponent, IMyClass { public string _address { get; private set; } public string _filename { get; private set; } [DispId(4)] public void DownloadFileAsync(string address, string filename) { _address = address; _filename = filename; System.Net.WebClient wc = new System.Net.WebClient(); Task.Factory.StartNew(() => […]

在C#中实现OPOS设备

对于一些传统POS应用程序的互操作,我想知道是否有可能在C#中实现虚假的OPOS设备。 基本上我会实现一个虚假键盘,它接受Web请求并将按键传递给遗留应用程序。 有谁知道这是可能的还是在哪里获得文件? 我认为OPOS刚刚调用了由注册表项配置的COM对象。 所有这些都应该在C#中实现。

使用C#注册免费COM互操作,可能吗?

是否可以使用注册免费COM与Dotnet互操作和C#? 如果是这样,如何在C#项目中添加对COM对象的引用? 我有一个免费的ATL COM服务器DLL,带有嵌入式清单和两个测试客户端,一个cpp,另一个c#。 cpp客户端使用import语句正确引用COM对象 #pragma comment(linker, “\”/manifestdependency:type=’win32′ name=’TestComSvr2′ version=’1.0.0.0’\””) 或者在Linker-> Manifest File选项下将’Additional Manifest Dependencies’设置为“type =’win32’name =’TestComSvr1’version =’1.0.0.0’”,之后cpp客户端只要COM组件正确运行在同一目录中。 c#客户端虽然拒绝播放。 尝试将文件引用添加到未注册的COM组件dll或未注册的tlb会导致错误: “无法添加对’blah blah’的引用。请确保该文件是可访问的,并且它是有效的程序集或COM组件”。 仅使用’regtlib TestComSvr’注册类型库,然后创建文件或COM引用,导致c#项目无法构建: “加载类型库/ DLL时出错。(HRESULTexception:0x80029C4A(TYPE_E_CANTLOADLIBRARY))”。 通常在c#项目中注册COM组件并创建引用,将引用设置为Isolated,构建c#项目然后取消注册组件并运行c#项目会导致此exception: 由于以下错误,检索具有CLSID {B1D0A80F-0050-4856-BACD-87D664E58CBE}的组件的COM类工厂失败:80040154未注册类(HRESULTexception:0x80040154(REGDB_E_CLASSNOTREG))。 注意:即使这有效也无论如何都不是一个有用的案例,因为最终它仍然需要注册组件,我只是测试它的彻底性。 到目前为止,我能够从C#引用COM对象的唯一方法是注册COM对象本身,这当然完全违背了这一点,从那以后它根本就没有注册。 有人有任何想法吗? (这是在带有VS2010 sp1的WinXP上)。