Tag: com

具有自定义ConfigurationSection的COM +服务器配置

我有一个COM +服务器托管.Net组件实现ServicedComponent。 COM +服务器需要访问已定义自定义配置节的配置文件。 我可以使用以下代码加载配置: ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap(); fileMap.ExeConfigFilename = @”%MY_FOLDER_WITH_ALL_DLLS%\MyComServer.dll.config”; Configuration config = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None); // All is fine until the next line: MyCustomSettings customSettings = (MyCustomSettings)tempConfiguration1.GetSection(“customSettings”); System.InvalidCastException:无法将类型为“System.Configuration.DefaultSection”的对象强制转换为“MyProject.MyCustomSettings” 以下是我在配置文件中声明自定义配置部分的方法: 这种情况确实会返回一个DefaultSection对象,因为我期待一个CustomSettings对象,所以它看起来并没什么用处。 请注意,MyProject名称很强。 一个选项是在GAC中安装MyProject.dll程序集,但出于组织原因,此解决方案没有吸引力。 还有其他建议吗? 如何从DLLHost中运行的进程加载给定程序集的配置文件中的自定义配置节? 谢谢。

如何使用dynamic关键字从COM对象获取属性

我有一个从第三方API返回的COM对象。 这个COM对象上有一个属性,它有一堆关于该对象的系统信息……返回的属性是“System.Object”类型。 调试这个COM对象时,我看到了我感兴趣的属性,并且Visual Studio调试器(2012)将动态视图附加到该对象,允许我看到它是一个像字典这样的对象的数组…… 我能够硬编码一些动态关键字用法来提取我关心的这个对象的值,如下所示: var temp = ((dynamic)myObject.someProperty)[11].ValueString; 虽然这有效,但显然有更好的方法,因为Visual Studio调试器能够动态枚举和显示该对象的内容…… 如何在C#中实现相同的function,最好不使用任何互操作方法,并使用动态关键字?

COM Interop挂起冻结整个COM系统。 如何取消COM通话

我正在使用通过COM Interop包装器公开的第三方dll。 但是,其中一个COM调用经常冻结(至少不会返回)。 为了尝试至少使我的代码更健壮,我异步地包装了调用( _getDeviceInfoWaiter是一个ManualResetEvent ) var backgroundWorker = new BackgroundWorker(); backgroundWorker.DoWork += (sender, eventArgs) => { var deviceInfo = _myCom.get_DeviceInfo(0); _serialNumber = deviceInfo.SerialNumber; _getDeviceInfoWaiter.Set(); }; backgroundWorker.RunWorkerAsync(); var waitFifteenSecondsForGetInfo = new TimeSpan(0, 0, 0, 15); _getDeviceInfoWaiter.WaitOne(waitFifteenSecondsForGetInfo, true); if(String.IsNullOrEmpty(_serialNumber)) throw new ArgumentNullException(“Null or empty serial number. ” + “This is most likely due to the get_DeviceInfo(0) […]

如何部署COM

我刚刚完成了我的新COM项目(C#,.NET 3.5)。 该项目将由VFP应用程序调用。 它在我的开发机器上运行良好,但现在我需要知道如何在用户的机器上部署它。 点击一次不适用于这种项目,所以我想我不得不手动分发DLL。 那么,我应该把DLL放在哪里以及如何注册它? 顺便说一句,3.5框架已经安装在用户的机器上。 TIA

C#组件事件?

我正在尝试编写一个C#组件,它将公开事件。 该组件将由非托管C ++应用程序导入。 根据一些教程我已经提出了这个代码(对于C#方面): namespace COMTest { [ComVisible(true), Guid(“02271CDF-BDB9-4cfe-B65B-2FA58FF1F64B”), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface ITestEvents { void OnTest(); } [ComVisible(true), Guid(“87BA4D3A-868E-4233-A324-30035154F8A4”)] public interface ITest { void RaiseTest(); } // End of ITest [ComVisible(true), Guid(“410CD174-8933-4f8c-A799-8EE82AF4A9F2”), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(ITestEvents))] public class TestImplimentation : ITest { public TestImplimentation() { } public void RaiseTest() { if (null != OnTest) OnTest(); } public […]

加载时SideBySide免注册COM失败

我正在尝试创建一个没有COM注册的Delphi应用程序使用的C#COM服务器。 该过程在ms博客上进行了描述- 基于.NET的组件的免注册激活:演练 我创建了必需的清单文件,并将它们链接到程序集。 App Manifest: 和程序集清单: 那些工作正常(我认为)。 sxs不会报告任何错误。 clsid对于com-class也是正确的。 但是在启动应用程序时,它会因为exception0x8013101b而崩溃。 删除清单并在未找到类的exception中运行诅咒的应用结果。 让com-class注册的应用程序开始正常,没有任何错误。 例外可能会说“错误的框架版本”。 我试图在类清单中指定运行时。 但这并没有解决问题。 什么导致例外? 我该如何解决这个问题?

如何从C#导入和使用非托管C ++类?

我有一个原生的C ++ DLL,一些头文件和导入库。 有没有办法如何在dll中定义的C#中实例化对象? 我所知道的两种方式是: 将C ++代码包装到COM中 使用DLLImport和外部C函数

如何从C ++ COM迁移到C ++ CLI

我有一个C ++ DLL,通过COM公开东西。 我想将其转换为公开托管接口的C ++ / CLI。 理想情况下,我只需添加CLI并逐个转换接口。 到目前为止,我还没有成功,所以我正在寻找一个具体的策略。 更多细节:很久以前,我使用COM创建了一个应用程序,用于在C#和C ++之间来回通信。 我厌倦了COM,并且在C ++方面需要注册和箍跳。 我想使用C ++ / CLI,并将整个工作作为托管代码,偶尔从C ++ / CLI调用我正在使用的本机库。 任何人都可以提出一个温和的迁移路径,这样我就可以同时使用CLI和COM,并且在我去的时候通过类测试转换类。 或类似的东西。 需要说明的是:我目前拥有定义和实现COM接口的本机C ++代码。 我有C#代码使用COM属性来导出类。 所有这些东西都被注册为COM互操作,并且有两个方向的呼叫。 我希望将C ++切换到CLI并切换到C ++中的托管类而不是COM类。 Ramhound更新了问题:无论如何,我遇到了砖墙。 在C ++ dll上打开/ clr会给我尝试连接到该C ++代码的其他东西带来链接错误。 (那种让我远离C ++的不可读的ATL / COM消息)

Winforms:一个COM对象需要一个STAThread,另一个需要一个MTAThread。 我该如何使用它们?

我正在尝试使用两个COM组件构建Winforms应用程序。 但是,其中一个组件仅在使用[MTAThread] ,而另一个仅适用于[STAThread] 。 推荐的解决方案是什么?

从自己的C#Dll in Progress 4GL创建COM-Object

我想知道如何从我自己的C#DLL创建一个Com-Object。 我在C#中创建了以下类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.InteropServices; namespace ProgressNet { [Guid(“a9b1e34d-3ea3-4e91-a77a-5bcb25875485”)] [ClassInterface(ClassInterfaceType.AutoDual)] [ComVisible(true)] [ProgId(“ProgressNet.Server”)] public class NetServer { public NetServer() {} [DispId(1)] public string GetString() { return “Some String”; } } } 在属性中,我检查了注册COM Interop。 然后我用regasm注册了DLL。 regasm G:\ProgressTestApp\ProgressNet.dll /tlb:G:\ProgressTestApp\ProgressNet.tlb /codebase 然后我尝试了Progress 4GL这段代码: DEFINE VARIABLE NetServer AS COM-HANDLE. CREATE “ProgressNet.NetServer” NetServer. MESSAGE […]