标签: unmanaged

C++:在混合使用C++/CLI和C++时获取c3859错误代码

按照C++中 Hans Passant的建议完成后 :在使用pstsdk时获取"错误C2065:'pst':未声明的标识符"?(工作),我的代码现在看起来像这样:

private:
    System::Void readPstFileButton_Click(System::Object^  sender, System::EventArgs^  e) {
         pstsdk::pst myfile(marshal_as<std::wstring>(fileNameTextBox->Text));
    }
Run Code Online (Sandbox Code Playgroud)

我现在得到以下错误:

错误C3859:超出PCH的虚拟内存范围; 请使用'-Zm111'或更高版本的命令行选项重新编译

错误C1076:编译器限制:达到内部堆限制; 使用/ Zm指定更高的限制

我绝对不希望这些发生,我也不知道如何解决它们.

c++ unmanaged c++-cli marshalling

11
推荐指数
1
解决办法
1万
查看次数

malloc和Marshal.AllocHGlobal之间有什么区别?

我在C#中编写了一个模块,它导出了一些在C中使用的函数.我需要为C < - > C#之间的一些结构分配一些内存.

我在CI中分配的内容使用malloc,而在C#中我使用Marshal.AllocHGlobal()(分配非托管内存以传递给C).

如果我释放()使用Marshal.AllocHGlobal分配的内存,并且我使用malloc分配的Marshal.FreeHGlobal()释放内存,是否有任何问题?

谢谢

c c# pinvoke unmanaged

11
推荐指数
1
解决办法
5567
查看次数

如何包含ValueTuple的结构可以满足非托管约束,但ValueTuple本身不能?

考虑以下类型:

  • (int, int) →管理.
  • struct MyStruct { public (int,int) Value; } →不受管理!

问题:MyStruct具有托管成员的非泛型结构(int,int)已被评估为托管类型.

预期行为:包含托管成员的结构应被视为托管,与被视为托管的方式相同struct MyStruct { int? Value; }.

似乎这两种类型都与文档[1][2]相反.

示例1 - 非托管约束

class Program
{
    static void DoSomething<T>() where T : unmanaged { }
    struct MyStruct {  public (int, int) Value; }
    static void Main(string[] args)
    {
        DoSomething<MyStruct>();    // ? OK
        DoSomething<(int, int)>();  // ? Shows compile-time error
    }
}
Run Code Online (Sandbox Code Playgroud)

错误CS8377类型"(INT,INT)"必须是一个非空值类型,与任何嵌套级别的所有字段一起,以便在通用类型或方法"Program.DoSomething使用它作为参数"T" ()"

示例2 - 指针或sizeof

使用上面的结构,指针或sizeof运算符的行为是相同的: …

.net c# generics unmanaged c#-7.3

11
推荐指数
1
解决办法
590
查看次数

托管与非托管类型

我正在阅读一篇关于如何sizeof在 C# 中使用运算符的文章

他们说:“用于获取非托管类型的大小(以字节为单位)。”

我知道托管和非托管代码之间的区别。但我的理解是,我用 C# 编写的所有代码(包括所有预定义和用户定义类型)都由 CLR 管理。那么他们所说的“非托管类型”是什么意思?

c# unmanaged managed sizeof

11
推荐指数
1
解决办法
1808
查看次数

使用托管C++/CLI中的C#扩展方法

如果我的术语有点偏离,请原谅我.我对托管C++/CLI的了解非常有限.

我有一个MFC应用程序使用启用了/ clr选项的DLL.这个dll使用几个C#dll与使用WCF的服务器通信.在大多数情况下,这工作正常.

在C#的DLL中的一个,我已经添加扩展方法的System.Net.IPAddress类,将检索的对象的IPAddress子网掩码(使用UnicastIPAddressInformation类及其IPv4Mask).扩展方法在C#方面运行良好,但我无法弄清楚如何在托管C++/CLI代码中使用它.

首先,这甚至可能吗?如果是这样,托管C++/CLI端的语法是什么样的?我必须使用/ clr:pure选项才能使用吗?

以下是扩展方法的示例:

using System.Net;
using System.Net.NetworkInformation;
public static class IPAddressExtensions
{
    public static IPAddress GetSubnetMask(this IPAddress address)
    {
        UnicastIPAddressInformation addressInfo = address.GetAddressInformation(); // elided
        return ((addressInfo != null) ? addressInfo.IPv4Mask : null);
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的托管C++代码中,如果可能的话,我将如何使用此扩展方法?

unsigned long bytes= 0x010000FF; // example address - 127.0.0.1
IPAddress^ address = gcnew IPAddress(BitConverter::GetBytes(bytes));
IPAddress^ subnet = address->GetSubnetMask(); // how do I do this???
Run Code Online (Sandbox Code Playgroud)

.net c# unmanaged c++-cli .net-3.5

10
推荐指数
1
解决办法
4787
查看次数

C#释放IntPtr引用的内存

我正在使用一些非托管代码,它将指针(IntPtr)返回给大图像对象.我使用引用但在完成图像后,我需要释放指针引用的内存.目前,唯一释放内存的是关闭我的整个应用程序.我需要能够从我的应用程序中释放内存.

这是对内存的分配的调用. hbitmap是返回的指针,需要取消分配.

[DllImport("twain_32.dll", EntryPoint = "#1")]
public static extern TwainResult DsImageTransfer(
    [In, Out] Identity origin, [In] Identity dest, DataGroup dg, 
    DataArgumentType dat, Message msg, ref IntPtr hbitmap);
Run Code Online (Sandbox Code Playgroud)

c# pointers unmanaged

10
推荐指数
2
解决办法
8019
查看次数

结束"Managed"的类名是什么意思(C#.NET)?

我对C#比较新,所以请耐心等待.我理解托管代码和非托管代码之间的基本区别.但是在使用某些方法时我仍然有点困惑.

例如,"管理"这个词在某些类名称结尾中是什么意思.这是否意味着他们是管理的而其他所有人都没有?例如,AesAesManagedSHA512SHA512Managed之间有什么区别?我知道你不能从托管类中派生出来,但这就是我所知道的.

还应该何时使用"Managed"classess,例如何时选择Aes而不是AesManaged

(我已经在wikipedia(这里)上阅读了托管代码的基础知识,并且还找到了关于托管代码基础知识的很好的解释(这里)

谢谢你的时间和答案.

.net c# cryptography unmanaged managed

10
推荐指数
2
解决办法
1579
查看次数

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

我是与非托管库交互的新手.我有一个非托管的C函数,它通过函数内的引用修改字符串.我在从C#传递字符串并通过C函数修改它时遇到了麻烦.

这是C函数:

__declspec(dllexport) void __stdcall Test(char* name)
{
    *name = "Bar";
}
Run Code Online (Sandbox Code Playgroud)

这是C#DLL导入代码:

[DllImport(@"C:/blah/mylibrary.dll")]
public extern static string Test(string name);
Run Code Online (Sandbox Code Playgroud)

这是我用来调用函数的代码:

string s = "foo";
Test(s);
//I want s to be "Bar" after the above line
Run Code Online (Sandbox Code Playgroud)

我尝试在字符串参数上使用"ref"和"out",并尝试将编组作为LPStr.根据我的尝试,我得到一个错误

"作为String传入的指针不能位于进程地址空间的底部64K."

要么

"试图读取或写入受保护的内存.这通常表明其他内存已损坏."

我确定我只是用我的指针做一些愚蠢的事情.有人可以帮我确定合适的C#代码,使"s"等于"bar"吗?

谢谢

c c# unmanaged managed

10
推荐指数
1
解决办法
6788
查看次数

非托管C#代码是否编译成IL并在CLR上运行?

在询问手动管理CLR内存的过程中,我意识到我知之甚少.

我知道当你退出托管上下文时,CLR会在堆栈上放置一个'cookie',这样垃圾收集器就不会破坏你的内存空间; 但是,在我读过的所有内容中,我都假设您正在调用一些用C语言编写的库.

我希望在托管上下文之外的C#中使用我的应用程序的整个写层来管理低级别的数据.然后,我想从托管图层访问此图层.

在这种情况下,我的Unmanaged C#代码是否会编译为IL并在CLR上运行?这是如何运作的?

c# clr unmanaged

10
推荐指数
1
解决办法
2834
查看次数

C#"非托管出口"

我一直在尝试使用Robert Giesecke在Visual Studio 2010 pro/C#项目中的扩展"Unmanaged Exports".然而,我无法使其工作 - 当我检查编译的DLL导出时,查看器(http://www.nirsoft.net/utils/dll_export_viewer.html)总是空出来,似乎没有定义出口所有.

我已经复制了示例,并将build/config manager/active平台设置为x86.我可以以某种方式检查执行所有魔法的MSBuild任务是否实际运行?项目文件应该包含什么(对我来说似乎是空洞的?)

c# unmanaged

10
推荐指数
2
解决办法
8782
查看次数

标签 统计

unmanaged ×10

c# ×9

.net ×3

managed ×3

c ×2

c++-cli ×2

.net-3.5 ×1

c#-7.3 ×1

c++ ×1

clr ×1

cryptography ×1

generics ×1

marshalling ×1

pinvoke ×1

pointers ×1

sizeof ×1