按照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#中编写了一个模块,它导出了一些在C中使用的函数.我需要为C < - > C#之间的一些结构分配一些内存.
我在CI中分配的内容使用malloc,而在C#中我使用Marshal.AllocHGlobal()(分配非托管内存以传递给C).
如果我释放()使用Marshal.AllocHGlobal分配的内存,并且我使用malloc分配的Marshal.FreeHGlobal()释放内存,是否有任何问题?
谢谢
考虑以下类型:
(int, int) →管理.struct MyStruct { public (int,int) Value; } →不受管理!问题:MyStruct具有托管成员的非泛型结构(int,int)已被评估为托管类型.
预期行为:包含托管成员的结构应被视为托管,与被视为托管的方式相同struct MyStruct { int? Value; }.
示例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运算符的行为是相同的: …
如果我的术语有点偏离,请原谅我.我对托管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) 我正在使用一些非托管代码,它将指针(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函数,它通过函数内的引用修改字符串.我在从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"吗?
谢谢
在询问手动管理CLR内存的过程中,我意识到我知之甚少.
我知道当你退出托管上下文时,CLR会在堆栈上放置一个'cookie',这样垃圾收集器就不会破坏你的内存空间; 但是,在我读过的所有内容中,我都假设您正在调用一些用C语言编写的库.
我希望在托管上下文之外的C#中使用我的应用程序的整个写层来管理低级别的数据.然后,我想从托管图层访问此图层.
在这种情况下,我的Unmanaged C#代码是否会编译为IL并在CLR上运行?这是如何运作的?
我一直在尝试使用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任务是否实际运行?项目文件应该包含什么(对我来说似乎是空洞的?)