Tag: unmanaged

未管理的内存未显示在任务管理器中

我写了以下测试(实际上在更广泛的背景下使用) IntPtr x = Marshal.AllocHGlobal(100000000); Console.Write(“Press any key to continue . . . “); Console.ReadKey(true); Marshal.FreeHGlobal(x); Console.ReadKey(true); 为什么任务管理器在第一次按键之前没有显示分配的100兆字节的任何迹象? 如果这是设计的,我还能如何测试非托管堆内存的消耗?

如何找到“由’xxx.dll导入的过程’的源无法加载。”例外?

过去一周我一直在追逐这个例外。 情况是: 我有一个用C#编写并在Visual Studio 2010中构建的应用程序。该应用程序包含一个DLL,它是非托管代码库的包装器。 非托管代码是用C ++编写的,并在Visual Studio 2008中构建。这是必需的,因为代码引用了额外的库(Qt),并且该代码以WinCE版本5为目标(由于字段中支持的设备而必需)。 我已经尝试了很多我在这里看到的建议,包括使用各种依赖步行器(VS 2008依赖,dependency_walker和Dependz)以及其他工具,如SysInternals的Reflector和Process Monitor。 所有这些工具都没有显示任何问题(Reflector)或在我的环境(Win 7)中过时的旧依赖项,如DCOMP.DLL,GPSVC.DLL和IESHIMS.DLL。 在调试器中,我可以直接执行我的代码,直到我实例化一个引用我的Managed Wrapper DLL的对象。 它不会进入对象的实例化,而是立即抛出exception。 在Process Explorer(来自SysInternals)中,我可以看到加载的Managed DLL以及必要的辅助DLL。 在进程监视器(来自SysInternals)中,在问题出现时,没有堆栈的未找到的消息。 它失败了。 任何想法或想法发现这个问题将不胜感激。

从C#调用非托管函数:我应该传递StringBuilder还是使用不安全的代码?

我有一个C#程序需要将char缓冲区传递给非托管函数。 我发现两种似乎可靠的方法,但我不确定我应该选择哪种方式。 这是非托管函数的签名。 extern “C” __declspec(dllexport) int getNextResponse(char *buffer); 第一个选项是将缓冲区定义为StringBuilder,如下所示。 //at class level… [DllImport(“mydll.dll”)] static extern int getNextResponse(StringBuilder buffer); //in main method body… StringBuilder sb = new StringBuilder(” “, 65536); int rc = getNextResponse(sb); 这很简单,它可以工作,我想我基本上理解为什么它可以工作,因为StringBuilder在幕后有一个缓冲区,所以(我假设)interop层只是将StringBuilder编组为char *。 另一种选择是使用不安全的代码。 //at class level… [DllImport(“mydll.dll”)] static extern int getNextResponse(byte* buffer); //separate method… private static unsafe int runGetNextResponse(byte[] buffer) { […]

什么是从C#调用QuantLib方法的最佳方法

我将在C#app( http://quantlib.org/docs.shtml )中使用QuantLib,但我不相信他们的.NET转换项目(太不成熟)。 我只需要期权估价部分。 有人在托管应用中使用它吗? 什么是最好的方法?

从.NET调用非托管代码

我正在尝试在我的c#程序中使用dll,但我似乎无法让它工作。 我已经制作了如下所示的测试应用程序。 返回值为0,但它实际上并不执行它应该执行的操作。 以下命令确实有效: rundll32 cmproxy.dll,SetProxy /source_filename proxy-1.txt /backup_filename roxy.bak /DialRasEntry NULL /TunnelRasEntry DSLVPN /Profile “C:\Documents and ettings\Administrator\Application Data\Microsoft\Network\Connections\Cm\dslvpn.cmp” 码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; using System.Runtime.InteropServices; using System.Net; using WUApiLib; namespace nac { class Program { [DllImport(“cmproxy.dll”, CharSet = CharSet.Unicode)] static extern int SetProxy(string cmdLine); static void Main(string[] args) […]

我如何在c#中使用c ++ dll

我喜欢在我的c#应用程序中导入c ++ dll我怎么能这样做?我需要使用什么概念呢?

调用非托管函数char返回char *

我在非托管C / C ++代码(dll)中有一个函数,它返回一个包含char数组的结构。 我创建了C#struct来接收调用该函数的返回值。 并且调用此函数的uppon得到’System.Runtime.InteropServices.MarshalDirectiveException’ 这是C声明: typedef struct T_SAMPLE_STRUCT { int num; char text[20]; } SAMPLE_STRUCT; SAMPLE_STRUCT sampleFunction( SAMPLE_STRUCT ss ); 这是C#声明: struct SAMPLE_STRUCT { public int num; public string text; } class Dllwrapper { [DllImport(“samplecdll.dll”)] public static extern SAMPLE_STRUCT sampleFunction(SAMPLE_STRUCT ss); } 我使用1字节ASCII。 有没有人有如何做到这一点的提示或解决方案?

我想从C ++非托管代码中调用C#委托。 无参数委托可以正常工作,但是带参数的委托会使我的程序崩溃

以下是来自unmanged dll的函数的代码。 它将函数指针作为参数接收,并简单地返回被调用函数返回的值。 extern __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)()); extern __declspec(dllexport) int _stdcall callDelegate(int (*pt2Func)()) { int r = pt2Func(); return r; } 在托管的C#代码中,我使用委托调用上面的umanged函数。 unsafe public delegate int mydelegate( ); unsafe public int delFunc() { return 12; } mydelegate d = new mydelegate(delFunc); int re = callDelegate(d); [DllImport(“cmxConnect.dll”)] private unsafe static extern int callDelegate([MarshalAs(UnmanagedType.FunctionPtr)] mydelegate […]

编组指向字符串数组的指针

我在编组指向字符串数组的指针时遇到了一些麻烦。 它看起来像这样无害: typedef struct { char* listOfStrings[100]; } UnmanagedStruct; 这实际上是嵌入在另一个结构中,如下所示: typedef struct { UnmanagedStruct umgdStruct; } Outerstruct; 非托管代码回调到托管代码,并将Outerstruct作为IntPtr返回,并分配内存并填入值。 管理世界: [StructLayout(LayoutKind.Sequential)] public struct UnmanagedStruct { [MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)] public string[] listOfStrings; } [StructLayout(LayoutKind.Sequential)] public struct Outerstruct { public UnmanagedStruct ums; } public void CallbackFromUnmanagedLayer(IntPtr outerStruct) { Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct)); // The above line FAILS! […]

什么相当于C#中的WORD?

我正在尝试访问一个非托管库,很幸运能够访问API的综合指南。 不幸的是,我不知道C ++的WORD类型是什么。 同样,我不知道DWORD会是什么。