Tag: interop

用.NET实现替换C ++ ActiveX组件?

我有现有的托管和非托管软件,使用第三方提供的ActiveX组件来执行某些通信,但现在要求通过我的应用程序路由此通信。 理想情况下,我将能够安装一个.NET组件,它将公开完全相同的接口,并可用作替代品。 但是,我遇到了对COM的理解,这无疑是最小的。 如何最好地确保我的接口实现与现有对象100%二进制兼容? 如何确保应用程序使用我的接口实现而不是遗留实现? 这只是注册我的实现和取消注册遗留实现的问题吗? 我如何确保它是“插入式”替代品,并且不需要更改现有软件? 如何确保非托管代码可以毫无问题地使用它? 注意:我可以要求使用.NET 4.0,如果这样可以使事情变得更简单。 编辑: Bounty将被移动到此处如何调试使用我的.NET ActiveX控件的VB6应用程序为什么不注册事件? 2天后。

从托管代码调用C代码

我目前有一个C函数,我想在.NET(C#)中使用。 我可以看到实现这个目标的两种方法: 用VC ++ .NET上的/ clr编译它(我认为这是可能的),实现了调用C代码的“façade”托管方法。 将C代码编译为DLL,然后进行API调用。 你觉得什么最好? 如何做到第一个? 更新 根据要求,这是我需要从托管代码调用的(唯一)函数: int new_game(double* params1, double* params2); 还有一个问题(虽然更难) 我有一个表单的function int my_hard_to_interop_function(double** input, double **output, int width); 其中输入和输出都是2D双数组。 它们的宽度由width给出,它们的高度由函数知道。 我应该从我的C#应用​​程序中调用这个C方法。

在包装Interop COM对象时,如何在c#中实现dispose模式?

我的类包含来自Interop的对象,并在其上调用一个方法,使其分配内容。 它还公开了一个释放这些东西的方法,所以我希望我应该在Dispose()中调用它: class MyClass : IDisposable { private DllName.ComClassName comInstance; void SomeMethod() { comInstance = new DllName.ComClassName(); comInstance.AllocStuff(); } public void Dispose() { comInstance.FreeThatStuff(); } } 现在,我应该扩展所有这些以遵循Dispose模式。 我没有其他一次性或非托管资源可以发布,所以假设comInstance被管理(不是Interop所做的那样,将非托管包装到托管?),我认为该模式解决了: public void Dispose() { if (comInstance != null) { comInstance.FreeStuff(); comInstance = null; } } 哪个泄漏除非我在MyClass的实例上显式调用Dispose(),这会使Dispose模式有缺陷? 这是否意味着comInstance必须是非托管的,并且模式解析为: public void Dispose() { DisposeComInstance(); GC.SuppressFinalize(this); } ~MyClass() { DisposeComInstance(); […]

P / Invoke,Pinning和KeepAlive最佳实践

在工作中,我们有一个本机C代码,负责读取和写入专有的平面文件数据库。 我有一个用C#编写的包装器,它将P / Invoke调用封装到OO模型中。 自项目启动以来,P / Invoke调用的托管包装器的复杂性大大增加。 有趣的是,当前的包装器做得很好,但是,我认为我实际上需要做更多的事情以确保正确的操作。 答案带来了几个笔记: 可能不需要KeepAlive 可能不需要GCHandle固定 如果您确实使用GCHandle,请尝试…最终该业务(但CER问题未解决) 以下是修订代码的示例: [DllImport(@”somedll”, EntryPoint=”ADD”, CharSet=CharSet.Ansi, ThrowOnUnmappableChar=true, BestFitMapping=false, SetLastError=false)] [ReliabilityContract(Consistency.MayCorruptProcess, Cer.None)] internal static extern void ADD( [In] ref Int32 id, [In] [MarshalAs(UnmanagedType.LPStr)] string key, [In] byte[] data, // formerly IntPtr [In] [MarshalAs(UnmanagedType.LPArray, SizeConst=10)] Int32[] details, [In] [MarshalAs(UnmanagedType.LPArray, SizeConst=2)] Int32[] status); public void Add(FileId file, string […]

如何在C#Visual Studio项目中添加VC ++ DLL作为参考?

我想在我的C#Visual Studio项目中添加VC ++ DLL引用。 但是当我尝试添加它时,我看到“它不是有效的程序集或COM组件”。 请建议如何使用VC ++ DLL作为C#项目的参考。

关于COM Interop对象的思考

尝试为POCO创建一个Microsoft Office对象的映射器并找到它 // doesn’t work // returns an empty array where o is a RCW on an office object foreach(var pi in o.GetType().GetProperties() ) tgt.SetValue(rc, pi.GetValue(o, null)); 所以不得不求助于此 foreach(var field in tgt.GetFields() ){ var pv = o.InvokeMember(field.Name, System.Reflection.BindingFlags.GetProperty, null, o, null); i.SetValue(rc, pv); } 它现在有效,但想知道为什么RCW.GetProperties()在这里不起作用?

C#sizeof(枚举)替代? (解决方法resharper false error)?

在C#中,我有一些与UAC提升相关的“安全”API代码。 它涉及获取枚举的大小(如下) int myEnumSize = sizeof (MyEnum); 代码本身是有效的,编译,正常工作等。但Resharper在解决方案中错误地将其标记为错误(“不能在安全上下文中使用不安全的构造”)。 ( 从C#2.0版开始,将sizeof应用于内置类型不再需要使用不安全模式。 )我喜欢Resharper,我喜欢解决方案分析,但是在解决方案中使用此代码我有一个很大的红点让我觉得有些东西被打破的角落。 如果我告诉resharper忽略这个错误,它会在几分钟内回来。 我会提出JetBrains的问题,但我看了他们的跟踪器,他们已经有一个记录,自3月以来一直被忽略。 进一步观察他们至少还有两个这样的记录事件可以追溯到几年前,两者都被解雇,并且处于“无重复”状态。 我不想只是为了对这个错误进行投票而注册他们的跟踪器。 我可能最终屏住呼吸多年了。 最快的方法就是解决这个问题。 什么是最好的替代方案,仍然是正确的,并且最小的机会导致维护者以后遇到麻烦? 我可以硬编码: int myEnumSize = 4; 有更正确的解决方案吗? – 哪个不使用sizeof(枚举)? BTW: Marshal.SizeOf() 是完全“安全”但返回错误的大小。 PS。 问题中的代码很大程度上受到Microsoft的UACSelfElvation演示代码的影响。 如果您想了解更多细节。 但我不认为它们是相关的。

DLLImport Int ** – 如果可以的话,如何做到这一点

我试图使用第三方DLL,它想要一个int **作为方法的参数之一。 它将参数描述为指向内存分配的指针的地址。 对不起任何困惑。 我认为参数是双向的。 DLL用于与FPGA板通信,该方法是在主机PC和PCI板之间建立DMA传输。

如何在部署dll之后在C#中获取安装目录

在dll(C#)中工作时是否有一些聪明的方法来检索安装路径,这将从另一个文件夹中的应用程序调用? 我正在为应用程序开发一个加载项。 我的加载项是用C#编写的。 将使用的应用程序是用C编写的,需要在评估期间编译一些东西,所以我有一个带有C ++ dll的middlestep,用C#处理互操作业务,只显示C可以使用的外部干净接口。 我部署的是一组.dll和一个.lib和.h用于C ++部分(有时需要静态绑定)。 在尝试设置并从C#dll打印出当前目录信息时: Console.WriteLine(Directory.GetCurrentDirectory()); 要么: Console.WriteLine(System.Environment.CurrentDirectory); 我得到了可执行文件路径。 那么……再一次,我如何获得我的dll的安装路径? 编辑:他们都工作了! 谢谢你的快速回复!

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

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