Tag: com

如何使.NET COM对象成为单元线程?

默认情况下,.NET对象是自由线程的。 如果通过COM封送到另一个线程,它们总是被封送到自己,无论创建者线程是否是STA,并且无论其ThreadingModel注册表值如何。 我怀疑,他们聚合了Free Threaded Marshaler (有关COM线程的更多细节可以在这里找到)。 我想让我的.NET COM对象在封送到另一个线程时使用标准的COM marshaller代理。 问题: using System; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; using System.Windows.Threading; namespace ConsoleApplication { class Program { static void Main(string[] args) { var apt1 = new WpfApartment(); var apt2 = new WpfApartment(); apt1.Invoke(() => { var comObj = new ComObject(); comObj.Test(); IntPtr pStm; NativeMethods.CoMarshalInterThreadInterfaceInStream(NativeMethods.IID_IUnknown, comObj, out […]

C#中CreateObject的等效代码

我在VB6中有一个代码。 谁能告诉我如何用C#编写它。 此代码如下: Set Amibroker = CreateObject(“Broker.Application”) Set STOCK = Amibroker.Stocks.Add(ticker) Set quote = STOCK.Quotations.Add(stInDate) quote.Open = stInOpen quote.High = stInHigh quote.Low = stInlow quote.Close = stInYcp quote.Volume = stInVolume Set STOCK = Nothing Set quote = Nothing C#中CreateObject的等价物是什么? 我尝试添加对com对象的引用,但我找不到任何com对象作为Broker.Application或amibroker

Interop中将属性公开为.NET中的变体

我正在.NET中创建一个包装类(VB.NET,因为它发生但与C#同样相关),它暴露给COM,我试图包装的其中一个属性是Variant。 我以为我只能使用一个Object,但是我收到一个错误: Public Property FieldValue([vFieldID As Object = -1]) As Object不能作为属性’Let’向COM公开。 您将无法使用“Let”语句从Visual Basic 6.0为此属性分配非对象值(如数字或字符串)。* 我的财产声明如下: Public Property FieldValue(Optional ByVal vFieldID As Object = -1) As Object Get Return _objVAccess.FieldValue(vFieldID) End Get Set(ByVal value As Object) _objVAccess.FieldValue = value End Set End Property 我的属性实际上从数据库返回一个值,该值可以是整数,字符串,日期等,因此它不是 COM方面的对象。 是否有任何解决方法允许属性让?

C#暴露给COM – 接口inheritance

假设我有一个实现IBaseClass的类BaseClass 然后我有一个inheritanceIBaseClass的接口IClass。 然后我有一个名为class的类,它实现了IClass。 例如: [ComVisible(true), InterfaceType(ComInterfaceType.IsDual), Guid(“XXXXXXX”)] public interface IBaseClass { [PreserveSig] string GetA() } [ComVisible(true), InterfaceType(ComInterfaceType.IsDual), Guid(“XXXXXXX”)] public interface IClass : IBaseClass { [PreserveSig] string GetB() } [ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid(“XXXXXXX”)] public class BaseClass : IBaseClass { public string GetA() { return “A”; } } [ComVisible(true), ClassInterface(ClassInterfaceType.None), Guid(“XXXXXXX”)] public class Class : BaseClass, IClass { […]

具有32位VB6 COM对象的64位C#

我有一个32位进程内STA VB6 DLL。 我遗憾地对此无能为力。 我的C#组件从64位大大受益。 无论如何从我的64位进程调用/接口这个32位dll? 任何类型的包装或任何东西?

在C#/ .Net中创建进程外COM?

我需要在C#中创建一个进程外COM服务器(.exe),它将被同一个盒子上的多个其他进程访问。 组件必须是单个进程,因为它会将其提供的信息缓存到内存中的使用者。 注意:访问我的COM服务器的进程主要是Matlab进程,因此需要 COM接口。 我已经看到有关在.Net上创建进程内COM组件的线程溢出( 创建COM … )和Web上的线程,但我很难找到一种方法来创建.Net的进程外组件。 这怎么可以实现? 任何建议的参考? 谢谢。

哪些阻塞操作导致STA线程泵送COM消息?

当一个COM对象在STA线程上实例化时,该线程通常必须实现一个消息泵,以便为来回调用其他线程(见此处 )。 可以手动泵送消息,或者依赖于某些( 但不是全部 )线程阻塞操作在等待时自动泵送COM相关消息的事实。 文档通常无助于决定哪个是哪个(参见相关问题 )。 如何确定线程阻塞操作是否会在STA上泵送COM消息? 到目前为止的部分清单: 阻塞操作泵*: Thread.Join WaitHandle.WaitOne / WaitAny / WaitAll (虽然无法从STA线程调用WaitAll ) GC.WaitForPendingFinalizers Monitor.Enter (因此lock ) – 在某些条件下 ReaderWriterLock BlockingCollection 阻止不泵送的操作: Thread.Sleep Console.ReadKey (在某处读取) *注意Noseratio的答案说,即使是操作泵,也是为了非常有限的未公开的COM特定消息集。

如何抑制由我​​无法更改的代码显示的对话框?

我有来自第三方的Inproc COM服务器。 如果它捕获特定类型的错误,我调用的函数之一将显示错误消息对话框。 问题是我正在尝试批量处理数据,而我使用的数据源导致错误对话框弹出很多。 如果它产生1000个对话框,这不会是一个问题,而是它会阻塞,直到您按OK才会返回该function。 如何禁止显示对话框,或以编程方式按OK? 这是一个调用堆栈的副本,​​因为它正在等待我按OK [管理到原生过渡] > System.Windows.Forms.dll!System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(System.IntPtr dwComponentID,int reason,int pvLoopData)Line 2198 + 0x1e bytes C# System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(int reason,System.Windows.Forms.ApplicationContext context)Line 3422 + 0x1b bytes C# System.Windows.Forms.dll!System.Windows.Forms.Application.ThreadContext.RunMessageLoop(int reason,System.Windows.Forms.ApplicationContext context)Line 3306 + 0xc bytes C# System.Windows.Forms.dll!System.Windows.Forms.Application.Run(System.Windows.Forms.Form mainForm)第1495行+ 0x31字节C# UniversalDataImporter.exe!UniversalDataImporter.Program.Main()第18行+ 0x1d字节C# [原生于管理过渡] [管理到原生过渡] mscorlib.dll!System.AppDomain.ExecuteAssembly(string assemblyFile,System.Security.Policy.Evidence assemblySecurity,string [] args)2023行+ 0x18字节C# Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()+ 0x27 bytes mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态)第68行+ 0x27字节C# mscorlib.dll!System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object […]