Tag: com

C#如何在没有注册的情况下使用遗留DLL(regsvr32)

情况 我运行一个构建系统,为许多项目执行许多构建。 为了避免一个构建影响另一个构建,我们将构建用户锁定为仅其工作区。 构建作为非特权用户运行,只对工作区具有写入function。 挑战 在我们的新构建期间,我们需要使用通过COM公开其接口的传统3rdparty DLL。 开发团队想要注册构建(regsrv32.exe),但我们的构建安全机制阻止了此活动。 如果我们放松政权,那么第三方DLL将影响其他构建,如果我有两个构建需要两个不同的版本,我可能有错误的构建编译错误的版本(一个非常现实的可能性)。 题 除了注册之外还有其他选项来处理通过COM公开其接口的遗留DLL吗? 谢谢您的帮助 彼得

从exe中检索COM ProgID而不注册它

背景: 我想从VB6应用程序中提取COM数据,以便我可以正确地注册它(根据Microsoft最佳实践)应用程序。 我正在使用WiX 3.0并且heat.exe不会提取数据(已知的热量问题),我没有准备好访问相关的TLB文件。 VB6应用程序没有打开兼容性,因此它会在每次构建时重新生成COM GUID(他们希望应用程序能够与旧版本并行运行。) 我创建了一个C#应用程序,它将从VB6应用程序收集TypeLib,接口和CoClass信息,而无需注册它并创建一个wxs文件供蜡烛使用。 我的公司有其他几个这样的旧应用程序,我想使它成为一个更通用的解决方案。 问题: 1.有没有办法从项目或TLB文件中的应用程序中收集“真正的”ProgID(程序员预期的)并且没有注册它? 2.有没有办法在没有注册的情况下从DLL中找出预期的线程模型? (我打算它可以处理所有COM活动项,也可以完成)谢谢。

C#MTA线程创建STA COM对象的危险

我目前正在查看我们在.Net Framework 2.0 Windows服务(C#)中遇到的问题,该服务具有运行X个MTA线程以访问COM组件。 每个线程初始化它自己的com组件对象的实例。 com组件对象没有任何UI元素。 它只是业务逻辑,它与sql server数据库和带有com接口的C#dll进行通信,而com接口又进行套接字通信并访问同一个sql server数据库。 通过我的研究,我发现你不应该在MTA线程上实例化STA COM组件,但我找不到任何特定的文本来说明这是什么危险或者可能是因为我不理解COM线程公寓那很好。 上面描述的模型会出现并发问题吗? 即使每个MTA线程都在创建自己的STA COM对象? 编辑 我们实际遇到的问题是对象引用未设置为后续代码块中连接字符串的setter中的对象错误的实例。 这发生在c ++ COM对象调用的C#COM对象中: IDbConnection connection; //Code omitted for brevity where connection is initialized connection.ConnectionString = myConnectionString; exception类型:System.NullReferenceException消息:未将对象引用设置为对象的实例。 数据:System.Collections.ListDictionaryInternal TargetSite:System.Data.OracleClient.OracleClient.OracleClient.OracleConnection.set_ConnectionString(String value)中System.Data.OracleClient.OracleConnection.ConnectionString_Set(String value)处的Void ConnectionString_Set(System.String)

在没有regsvr32的情况下从文件创建COM对象

是否可以仅使用dll而不使用regsvr32创建COM对象的实例? 我的主要目标是创建一个directshowfilter的实例并将其插入我的图形中 – 但我不想让regsvr32注册filter。 filter将在一个dll / ax中,将随我的应用程序一起分发,并将出现在我的路径中。 我也会知道CLSID。 所以我基本上只需要一个方法来创建一个类型的实例,同时只有dll / ax和CLSID。 这可能在C#中吗?

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接口? 在这种情况下它意味着什么?它如何修改互操作的行为?

“与基础RCW分离的COM对象不能与.NET 4.0一起使用”

我在.NET 3.5 C#WinForms应用程序中有一个类,它有五种方法。 每种方法都使用不同的C ++ COM接口集。 我使用Marshal.FinalReleaseCOMObject来清理这些COM对象。 此代码在此.NET平台上运行正常,没有任何问题。 但是,当我将此应用程序移动到.NET 4.0时,我开始在这些方法中的一个中将错误从ICOMInterface1为ICOMInterface2 ,即: ICOMInterface1 myVar= obj as ICOMInterface2; 无法使用已与其基础RCW分离的COM对象。 如果我删除使用Marshal.FinalReleaseCOMObject的行,我不会收到此错误。 我在这里想念的是什么? 如何从.NET 4.0平台上的内存中清除这些非托管COM对象?

在c#中实现IDispatch

我正在编写一些测试代码来模拟非托管代码,调用后期绑定COM对象的c#实现。 我有一个声明为IDispatch类型的接口,如下所示。 [Guid(“2D570F11-4BD8-40e7-BF14-38772063AAF0”)] [InterfaceType(ComInterfaceType.InterfaceIsDual)] public interface TestInterface { int Test(); } [ClassInterface(ClassInterfaceType.AutoDual)] public class TestImpl : TestInterface { … } 当我使用下面的代码调用IDispatch的GetIDsOfNames函数时 .. //code provided by Hans Passant Object so = Activator.CreateInstance(Type.GetTypeFromProgID(“ProgID.Test”)); string[] rgsNames = new string[1]; int[] rgDispId = new int[1]; rgsNames[0] = “Test”; //the next line throws an exception IDispatch disp = (IDispatch)so; IDispatch定义为: […]

Visual Studio 2010自动化和环境变量

我正在使用C#和VS2010自动化打开VS2010解决方案。 我打开这样的解决方案: Type type = Type.GetTypeFromProgID(“VisualStudio.DTE.10.0”, true); Object comObject = Activator.CreateInstance(type); … sol.Open(solution_full_path); 我遇到的问题是,当我创建VisualStudio.DTE.10.0对象的实例时,它从winlogon.exe启动devenv.exe进程,它看到的环境与我的应用程序完全不同。 某些环境变量对于解析项目中设置的某些路径很重要。 有没有我可以如何影响devenv.exe进程的环境变量? 有什么方法可以使用VS2010自动化接口注入环境/属性吗?

如何在C#中获取指向IUnknown的指针

.NET interop将COM对象包装到.NET对象(运行时可调用包装器,RCW)中,这隐藏了通常的接口查询。 为了使用Running Objects Table注册表示filter图形的COM对象,我需要其IUnknown接口的(本机)地址(请参阅如何对DirectShow图形进行反向工程? )。 所以问题是:如何在C#中获取COM对象的IUnknown指针?

C# – 将Nullable 暴露给COM的好方法

我们正在努力将程序集暴露给COM。 除此之外,我们频率使用可空值,例如long?,DateTime?等。这些是generics类型,不能暴露给COM。 什么是COM的这些数据类型的良好替代品? 我们尝试过以下方法: //Original CustomerID property in class public long? CustomerID { get; set; } //Explicit COM interface long IComInterface.CustomerID { get { return CustomerID.GetValueOrDefault(); } set { CustomerID = value; } } 问题是,我们需要一种通过COM来回传递“null”的方法。 使用-1或0之类的数字将不起作用,因为它们也是有效值。 我们不得不使用nullables b / c这些最初来自我们的数据库模式。