Tag: com

异步可插拔协议

使用此作为参考,我正在尝试创建一个异步可插入协议,该协议仅暂时可用于我的应用程序(而不是在系统范围内注册)。 我正在使用CoInternetGetSession ,然后调用RegisterNameSpace来完成它。 但是,当我调用RegisterNameSpace我得到一个AccessViolationexception: Attempting to read or write protected memory 。 知道发生了什么事吗? 我的代码如下所示: [ComImport] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] [Guid(“00000001-0000-0000-C000-000000000046”)] [ComVisible(true)] public interface IClassFactory { void CreateInstance(IntPtr pUnkOuter, ref Guid riid, out IntPtr ppvObject); void LockServer(bool fLock); } /* Custom class to act as a class factory that create’s an instance of the protocol */ [Guid(“0b9c4422-2b6e-4c2d-91b0-9016053ab1b1”)] [ComVisible(true),ClassInterface(ClassInterfaceType.AutoDispatch)] public […]

在Visual C#2008 Express Edition中设置32位x86构建目标?

我正在构建一个加载32位COM dll的C#应用​​程序。 编译的应用程序在32位Windows上正常运行,但在64位Windows上运行,因为它无法加载32位COM。 有没有办法在VC#2008 Express Edition中设置32位构建目标? 或者,有没有办法强制编译到AnyCPU构建目标的.NET应用程序在64位Windows上以32位模式运行?

与默认和公共类COM暴露有什么关系?

MSDN有关于[ComVisible]属性的这篇文章 。 当设置[ComVisible(true)]时,我不太清楚会发生什么。 MSDN说 默认值为true ,表示托管类型对COM可见。 不需要此属性来使公共托管程序集和类型可见 ; 它们默认情况下对COM可见。 只有公共类型可见。 所以他们说公共类型默认是COM可见的。 但是他们也说通过设置[ComVisible(true)] 只能看到公共类型 。 它没有意义:如果默认情况下公共类型是可见的,那么设置[ComVisible(true)]使公共类型可见? 如果它们已经可见,它们将如何变得更加明显? 也许我的理解不正确。 如果有人能对上述陈述有所了解,我将不胜感激。

C#+ COM Interop,确定性发布

COM对象通常具有确定性破坏:在释放最后一个引用时释放它们。 如何处理C# – COM Interop? 这些类没有实现IDisposable ,所以我认为无法触发显式的IUnknown :: Release。 随意测试显示未引用的COM对象被懒惰地收集(即垃圾收集器触发释放)。 我应该怎样对需要被激活释放的OCM对象做什么? (例如持有大型或共享的关键资源)? 原始问题:我们使用COM库大量使用C#应用程序,并且它像疯了一样泄漏。 似乎问题是“在C ++和C#代码之间”(我们可以同时访问它们),但我们无法确定它。

使用自动化Windows防火墙

我有C#应用程序使用PORT 777进行异步通信,PORT 3306用于与My Sql Server进行通信。 端口被防火墙阻止时出现问题。 我试图创建一个程序,在Windows 7的防火墙列表中添加一个例外。 当我运行程序时,我得到如下错误:“灾难性故障(HRESULTexception:0x8000FFFF(E_UNEXPECTED))”。 我不明白这些错误是什么意思,欢迎提出任何建议,谢谢。 protected internal void AddExceptionToFirewall(){ try { INetFwMgr fireWall = null; INetFwAuthorizedApplications apps = null; INetFwAuthorizedApplication app = null; Type progID = null; INetFwOpenPorts ports = null; INetFwOpenPort asyncPort = null; INetFwOpenPort mysqlPort = null; bool appFounded = false; bool asyncPortFounded = false; bool mysqlPortFounded = […]

分配null是否从对象中删除所有事件处理程序?

我在class上定义了新成员 protected COMObject.Call call_ = null; 这个类有我订阅的以下事件处理程序 call_.Destructed += new COMObject.DestructedEventHandler(CallDestructedEvent); 将我的成员设置为null,如下所示删除事件处理程序? call_ = null; 或者我必须取消订阅 – =?

Regfree COM事件从其他线程失败

我有一个COM可见的.NET类,它暴露事件并从VB6使用。 在过去的几天里,我一直试图让这个与regfree COM一起工作,但没有成功。 当从原始线程触发事件时,VB6事件以regfree模式运行。 当注册了类型库时,VB6事件在从另一个线程触发时运行。 (regasm / tlb / codebase后跟regasm / codebase / unregister,后者不注销tlb) 在regfree模式下从另一个线程触发时,它会抛出exception,因此永远不会执行VB6事件代码。 System.Reflection.TargetException: Object does not match target type. at System.RuntimeType.InvokeDispMethod(String name, BindingFlags invokeAttr, Object target, Object[] args, Boolean[] byrefModifiers, Int32 culture, String[] namedParameters) at System.RuntimeType.InvokeMember(String name, BindingFlags bindingFlags, Binder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParams) at […]

将JPEG图像转换为字节数组 – COMexception

使用C#,我正在尝试从磁盘加载JPEG文件并将其转换为字节数组。 到目前为止,我有这个代码: static void Main(string[] args) { System.Windows.Media.Imaging.BitmapFrame bitmapFrame; using (var fs = new System.IO.FileStream(@”C:\Lenna.jpg”, FileMode.Open)) { bitmapFrame = BitmapFrame.Create(fs); } System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.JpegBitmapEncoder(); encoder.Frames.Add(bitmapFrame); byte[] myBytes; using (var memoryStream = new System.IO.MemoryStream()) { encoder.Save(memoryStream); // Line ARGH // mission accomplished if myBytes is populated myBytes = memoryStream.ToArray(); } } 但是,执行ARGH行给我的信息是: COMException未处理。 句柄无效。 […]

如何在UWP应用程序中创建COM对象? (C#)

问题:如何在通用Windows平台(UWP)应用程序中创建COM对象? 动机:我想从WPF切换到UWP。 由于我的工作量要求只能通过COM访问第三方库(据我所知),我需要从UWP进行COM调用。 语境: C# 。净 Visual Studio 2015 Windows 10 理想情况下针对所有UWP设备,但如果仅限于台式机/笔记本电脑,则可以。 背景 在Visual Studio 2013(Visual Studio 2015中的“经典桌面”项目)中,我使用了C#代码 // Conceptual: DotNetInterface comObjectInstance = (DotNetInterface)Microsoft.VisualBasic.Interaction.CreateObject( “this string specified the COM object type” ); // Example: Open Excel via COM: Excel.Application oApp = (Excel.Application)Interaction.CreateObject(“Excel.Application”); Visual Studio项目需要对Microsoft.VisualBasic的引用才能使用Interaction.CreateObject()和COM对象的类型库。 我想在Windows 10 Education上的Visual Studio 2015 Enterprise生成的通用Windows平台(UWP)应用程序中使用此C#代码。 我能够添加对COM对象的类型库的引用,但无法引用Microsoft.VisualBasic因为它没有出现在Visual Studio的Reference Manager中。 思考,尝试过的解决方案,猜测等 我添加了对“UWP的Windows桌面扩展”的引用,希望它可以启用对普通.NETfunction的调用,但还没有弄清楚如何使用它。 […]

将大型虚拟文件从C#拖放到Windows资源管理器中

我有一个C#WPF应用程序,其中一个部分充当FTP客户端,列出远程服务器上的文件并允许用户下载它们。 我希望用户能够将文件列表中的文件拖放到他们自己的机器上(即进入Windows资源管理器shell)。 为了实现这一点,我使用了Delay的博客中的VirtualFileDataObject代码 ,使用了SetData的Action重载。 这适用于较小的文件。 我的问题是:我正在处理的一些文件非常大(2+ GB),而VirtualFileDataObject类处理流的方式涉及将整个内容读入内存,这最终会导致“存储空间不足”那些非常大的文件的错误。 VirtualFileDataObject代码的相关部分如下所示。 如何重写此代码以不要求整个流在内存中? public void SetData(short dataFormat, int index, Action streamData) { _dataObjects.Add( new DataObject { FORMATETC = new FORMATETC { cfFormat = dataFormat, ptd = IntPtr.Zero, dwAspect = DVASPECT.DVASPECT_CONTENT, lindex = index, tymed = TYMED.TYMED_ISTREAM }, GetData = () => { // Create IStream for data var ptr […]