Tag: unmanaged

如何在非托管c ++ dll中查找调用方程序集名称

我有一个非托管的c ++ DLL 。 我从c#(.net 3.5)调用这个非托管dll的外部方法 我正在寻找一种方法来找到女巫c#assembly正在调用我的非托管c ++ dll (进入我的c ++ dll)(至少,汇编名称) 当然, 我不想将任何其他参数传递给方法 。 提前致谢

从C#/ .NET调用C ++函数

我有一个有C ++项目和C#项目的解决方案。 C ++项目定义了一个类,我想在C#中实例化并调用其成员函数。 到目前为止,我设法实例化了这个类: CFoo Bar = new CFoo(); 但是当我尝试在其上调用函数时,编译器说,它不可用。 此外,当我在调试器中检查对象时,不会显示任何成员。 我在这里想念的是什么?

委托实例和方法指针之间有什么区别?

我认为委托实例可以与函数实例互换。 请使用以下代码: delegate int AddDelegate(int a, int b); AddDelegate DelegateInstance; public void DoStuff() { //I can call this without a delegate “instance”: MethodThatTakesAdd(Add); //I can also call it WITH a delegate “instance” DelegateInstance = Add; MethodThatTakesAdd(DelegateInstance); } public int Add(int a, int b) { return a + b; } public void MethodThatTakesAdd(AddDelegate addFunction) { Console.WriteLine(addFunction(1, […]

如何将非托管C ++表单嵌入到.NET应用程序中?

我已经能够成功地包装我的非托管Borland C ++ DLL,并从C#.NET 4.0应用程序启动它的表单。 是否可以将表单从dll直接嵌入到.NET应用程序中? 为了澄清,原始表单已经在Borland C ++项目中用作嵌入式控件。 它基本上看起来像一个自定义控件,坐在应用程序中的面板上。 当我说’嵌入’时,我的意思是将INTO放在一个表单中,就像将按钮,面板等放到表单上一样。 我不打算做个孩子。 如果这是不可能的,那么或许更好的问题是如何将无人管理的自定义控件嵌入到.Net应用程序中?

在传递给非托管代码之前固定updateble结构?

我使用一些旧的API,需要将结构的指针传递给异步运行的非托管代码。 换句话说,在我将struct指针传递给非托管代码之后,非托管代码会复制指针并立即返回。 非托管代码可以在后台访问该结构,在另一个线程中。 我无法控制在另一个线程和线程本身中运行的非托管代码。 fixed {}语句不能用于固定,因为它不是为异步非托管固定而设计的。 GCHandle只能引用引用,因此结构必须加框以使用GCHandle。 我试过了,它的确有效。 它的主要问题是您无法从托管代码更新结构。 要更新结构,首先我们需要将其取消装箱,然后更新,然后重新装箱,但是……哎呀……再次装箱?!? 这意味着内存中的前一个指针仍然指向旧的非最新结构,而新结构有另一个指针,这意味着我需要将新指针传递给非托管代码…不适用于我的案件。 如何在没有固定{}语句的情况下在内存中固定结构,以便我可以在不更改指针的情况下从托管代码更新它? 谢谢。 编辑: 只是想…有没有办法固定包含结构的父对象,然后获取结构的指针而不是容器对象?

P /调用Mono上动态加载的库

我正在编写一个使用一些非托管代码的跨平台.NET库。 在我的类的静态构造函数中,检测平台并从嵌入式资源中提取适当的非托管库并保存到临时目录,类似于另一个stackoverflow应答中给出的代码。 因此,当它不在PATH中时可以找到它,我在将它保存到临时文件后显式加载它。 在Windows上,这适用于kernel32.dll的LoadLibrary 。 我正在尝试使用Linux上的dlopen进行相同的操作,但是稍后在加载P / Invoke方法时会遇到DllNotFoundException 。 我已经validation库“libindexfile.so”已成功保存到临时目录,并且对dlopen的调用成功。 我深入研究了单声道源代码 ,试图弄清楚发生了什么,我认为可能归结为后续调用dlopen是否会重用以前加载的库。 (当然,假设我天真地通过单声道来源得出了正确的结论)。 这是我正在尝试做的形状: // actual function that we’re going to p/invoke to [DllImport(“indexfile”)] private static extern IntPtr openIndex(string pathname); const int RTLD_NOW = 2; // for dlopen’s flags const int RTLD_GLOBAL = 8; // its okay to have imports for the wrong platforms here […]

在“托管到原生过渡”期间究竟发生了什么?

我知道CLR需要在某些情况下进行编组,但是我要说: using System.Runtime.InteropServices; using System.Security; [SuppressUnmanagedCodeSecurity] static class Program { [DllImport(“kernel32.dll”, SetLastError = false)] static extern int GetVersion(); static void Main() { for (; ; ) GetVersion(); } } 当我用调试器进入这个程序时,我总是看到: 鉴于没有需要完成的编组(对吗?),有人可以解释一下这种“托管到原生的过渡”中实际发生了什么,以及为什么有必要?

在非托管C ++程序中实现C#DLL COM文件

这是我的另一个问题,也引用了这个问题作为参考: 如何从Un-managed C ++调用托管C ++方法 我已经成功创建了一个C#COM文件。 现在我需要一个关于如何在非托管C ++中实现它的简单解释。 我遵循这个例子,但c ++部分很弱。 http://www.codeproject.com/Articles/7859/Building-COM-Objects-in-C 这是我的COM文件 using System; using System.Runtime.InteropServices; using System.Collections.Generic; using System.Linq; using System.Text; namespace cSharpRiJHarn { [Guid(“ED1483A3-000A-41f5-B1BC-5235F5897872”)] public interface DBCOM_Interface { [DispId(1)] String encrypt(string s); [DispId(2)] String decrpyt(string s); } [Guid(“A6BCEC1D-B60C-4c97-B9AD-1FE72642A9F8”), InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface DBCOM_Events { } [Guid(“7C13A8C6-4230-445f-8C77-0CA5EDECDCB5”), ClassInterface(ClassInterfaceType.None), ComSourceInterfaces(typeof(DBCOM_Events))] public class RijndaelLink : DBCOM_Interface { […]

使用非托管代码使用扩展名获取文件图标时,在x86系统上获取exception

我正在开发磁盘目录应用程序,它要求我使用从数据库中检索的文件扩展名来获取文件图标。 使用他们的扩展程序获取文件图标的代码在我的Windows 7 x64机器上使用任何CPU调试配置都可以正常工作,但是当我在调试配置中切换到x86时,我得到以下错误。 致命执行引擎错误 当我试图在任何CPU配置的Windows XP x86中运行该应用程序时,我得到以下错误。 尝试读取或写入受保护的内存。 这通常表明其他内存已损坏 当我删除下面的代码应用程序完美无缺。 我想使用下面的代码从扩展名获取文件图标。 是否有任何解决方法来使代码在x86系统上工作? 我发现这个代码来自如何在C#中获取常见的文件类型图标? 。 /// /// Contains information about a file object. /// struct SHFILEINFO { /// /// Handle to the icon that represents the file. You are responsible for /// destroying this handle with DestroyIcon when you no longer need it. /// public […]

没有找到asp.net的OpenCV非托管DLL

我们正在构建一个Web应用程序(C#.NET),它使用Emgu opencv包装器forms的非托管库。 我们正在强制构建为32位(x86),我们正在使用32位版本的Emgu。 所有这些在本地构建上都很好用,但是当发布到我们的web服务器时,openCV Dll(s)无法加载: System.DllNotFoundException Unable to load DLL ‘opencv_core240’: The specified module could not be found. (Exception from HRESULT: 0x8007007E) System.TypeInitializationException: The type initializer for ‘Emgu.CV.CvInvoke’ threw an exception. —> System.DllNotFoundException: Unable to load DLL ‘opencv_core240’: The specified module could not be found. (Exception from HRESULT: 0x8007007E) at Emgu.CV.CvInvoke.cvRedirectError(CvErrorCallback errorHandler, IntPtr userdata, IntPtr […]