我现在正在开发一个项目,其中一部分使用托管C++.在托管C++代码中,我正在创建一个DataTable.在为数据表定义列时,我需要指定列的类型.在C#中,那会:
typeof运算(INT)
但是我如何在托管C++中做到这一点?
谢谢!
我目前在我的应用程序中使用 DataGridView 控件,并且遇到了一个奇怪的内存问题。我根本没有使用数据绑定,只是手动填充。我放在那里的数据根本不是很多。我们通常讨论的数据最多为 20 行 x 20 列。
该控件的工作流程是,我有一个包含不同“数据集”的组合框,当您选择它们时我会加载它们。因此,常见的使用场景是循环浏览组合框中的数据集并查看它们在 dataGrid 中呈现。我看到的是,当人们循环浏览数据集时,应用程序内存使用量立即从 100MB 跳到 1100MB,然后在 GC 启动时下降。但是,如果您快速循环浏览数据集(即比 GC 启动速度更快) in),你将耗尽内存并且应用程序将死掉。
经过调试,我发现内存疯狂跳跃的主要原因是我在该数据网格中有一些图像类型的列。我使用它们来显示一个 16x16 图标,指示该行的状态。这些图标存储在 ImageList 中,我只是在填充数据网格的行时将它们设置为该单元格的值。如果我取出图像并用简单的文本替换它们,我绝对不会看到任何内存峰值。
那么这是怎么回事呢?为什么图像,很小的 16x16,会导致控件对我的内存如此疯狂?
更多信息:
我切换数据集时的逻辑是:
我正在尝试使用通过C++ DLL提供的功能的C#应用程序.我现在有点困难让DLLImport定义正常工作.
这是等式的C++方面:
struct Result
{
FLOAT first;
FLOAT second;
};
struct ResultData
{
UINT uint1;
UINT uint2;
Result result;
Result* pResults;
};
#define DllImport __declspec(dllimport)
extern "C"
{
DllImport HRESULT APIENTRY Process(const PCWSTR FileName, const PCWSTR logfileFileName, const PCWSTR DataFileName, ResultData** ppResults);
DllImport HRESULT APIENTRY Release(ResultData* pResults);
}
Run Code Online (Sandbox Code Playgroud)
在C#方面,这是我到目前为止所做的:
[StructLayout(LayoutKind.Sequential)]
public struct Result
{
public float first;
public float second;
}
[StructLayout(LayoutKind.Sequential)]
public struct ResultData
{
public uint uint1;
public uint uint2;
public Result result;
public Result[] Results;
} …Run Code Online (Sandbox Code Playgroud) 我有一个编译为"任何CPU"的.Net应用程序.我在x64操作系统上运行它,因此它以64位运行.应用程序加载用户提供的其他程序集.它当然使用反射来从用户提供的程序集中读取类型.如果用户程序集编译为"任何CPU",一切正常.但是如果程序集被编译为x86,我会在反射时得到"这不是Win32应用程序"异常.这显然是因为主机应用程序运行64位.
我的问题是,我该如何解决这个问题?有什么想法/想法吗?
谢谢
c# ×3
.net ×1
32-bit ×1
64-bit ×1
c++-cli ×1
datagridview ×1
interop ×1
managed ×1
marshalling ×1
reflection ×1