Tag: managed

如何通过引用发送字符串来修改该字符串的非托管C库?

我是与非托管库交互的新手。 我有一个非托管的C函数,它通过函数内的引用修改字符串。 我在从C#传递字符串并通过C函数修改它时遇到了麻烦。 这是C函数: __declspec(dllexport) void __stdcall Test(char* name) { *name = “Bar”; } 这是C#DLL导入代码: [DllImport(@”C:/blah/mylibrary.dll”)] public extern static string Test(string name); 这是我用来调用函数的代码: string s = “foo”; Test(s); //I want s to be “Bar” after the above line 我尝试在字符串参数上使用“ref”和“out”,并尝试将编组作为LPStr。 根据我的尝试,我得到一个错误 “作为String传入的指针不能位于进程地址空间的底部64K。” 要么 “试图读取或写入受保护的内存。这通常表明其他内存已损坏。” 我确定我只是用我的指针做一些愚蠢的事情。 有人可以帮我确定合适的C#代码,使“s”等于“bar”吗? 谢谢

如何在从C到C#的结构中获得非托管可变长度C数组?

如何返回MIB_IPFORWARDROW数组? struct MIB_IPFORWARDTABLE { public uint Size; [MarshalAs(/* what goes here? */)] public IPFORWARDROW[] Table; }; [DllImport(“iphlpapi”, CharSet = CharSet.Auto)] private static extern int GetIpForwardTable( IntPtr /* MIB_IPFORWARDTABLE* */ pIpForwardTable, ref uint /* ULONG* */ pdwSize, bool bOrder); public static MIB_IPFORWARDROW[] Temp() { var fwdTable = IntPtr.Zero; uint size = 0; var result = GetIpForwardTable(fwdTable, […]

是否可以使用托管代码中的C#reflection调用非托管代码?

是否有可能使用reflection和C#.NET在.NET发布之前调用动态不同的函数(带参数)来编写C或C ++(非托管代码)? 和smole C#示例如果可能的话将不胜感激! 谢谢! Br,米兰。

如何找到“由’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)中,在问题出现时,没有堆栈的未找到的消息。 它失败了。 任何想法或想法发现这个问题将不胜感激。

在托管的Win8 metro应用程序中查找内存泄漏?

我目前正在使用C#和SharpDX为Windows 8开发一款地铁游戏。 该项目进展顺利,但最近需要开始追踪内存泄漏,我不确定从哪里开始。 Visual Studio 11中的内置内存分析器不适用于Metro应用程序,WinDBG似乎无法连接到metro应用程序(除非我使用不正确),而且我很难找到任何有关查看.NET 4.5 for metro中的托管分配。 有人对这个有经验么? 有一个好地方开始寻找? 有没有人成功使用工具来帮助检测Metro应用中的内存泄漏?

需要64位SQLite DLL用于托管C#应用程序

我正在尝试将SQLite嵌入到我的便携式C#.NET 2.0应用程序中,而不是将DLL文件包含在分发文件夹中。 但是,要嵌入SQLite,我不能使用PHXSoftware提供的混合模式库。 相反,我正在使用他们的“仅管理”版本。 这在32位计算机上运行良好,但是当它在64位计算机上运行时,会抛出格式exception。 正如我从这里发现的那样: http : //sqlite.phxsoftware.com/forums/p/2564/9939.aspx我需要在使用托管库之前先以所需的体系结构格式手动加载非托管sqlite3.dll。 这就是我失败的地方。 我找不到64位版本的SQLite以及32位版本。 有人可以帮忙吗? 我敢说,有没有人有更好的想法?

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

我知道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而不留下文件?

我已经阅读了另外两个在运行时从应用程序中提取dll的线程。 其中一种方法使用当前的Windows临时目录来保存dll,但它是一个非托管的dll,必须在运行时使用DllImport 。 假设我的托管dll导出到临时目录,我如何正确地将该托管程序集链接到我当前的MSVC#项目?

使用哪一个:托管与非托管哈希算法

在常规的C#应用​​程序中,哪个类用于散列: xxxManaged或xxx (即SHA1Managed vs SHA1 )以及为什么?

将char指针从C#传递给c ++函数

我被困在c#实现方面,因为我对它很陌生。 问题是,我想从c#代码传递一个’指针’(有内存),这样我的c ++应用程序就可以将pchListSoftwares缓冲区复制到pchInstalledSoftwares。 我无法弄清楚如何从c#侧传递指针。 本机c ++代码(MyNativeC ++ DLL.dll) void GetInstalledSoftwares(char* pchInstalledSoftwares){ char* pchListSoftwares = NULL; ….. ….. pchListSoftwares = (char*) malloc(255); /* code to fill pchListSoftwares buffer*/ memcpy(pchInstalledSoftwares, pchListSoftwares, 255); free(pchListSoftwares ); } 传递简单的’字符串’不起作用…… C#实现 [DllImport(“MyNativeC++DLL.dll”)] private static extern int GetInstalledSoftwares(string pchInstalledSoftwares); static void Main(string[] args) { ……… ……… string b = “”; GetInstalledSoftwares(0, b); […]