从托管C++,我调用一个非托管C++方法,它返回一个double.如何将此双精度转换为托管字符串?
我在非托管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 );
Run Code Online (Sandbox Code Playgroud)
这是C#声明:
struct SAMPLE_STRUCT
{
public int num;
public string text;
}
class Dllwrapper
{
[DllImport("samplecdll.dll")]
public static extern SAMPLE_STRUCT sampleFunction(SAMPLE_STRUCT ss);
}
Run Code Online (Sandbox Code Playgroud)
我使用1字节ASCII.
有没有人有关于如何做到这一点的提示或解决方案?
我有一个有C++项目和C#项目的解决方案.
C++项目定义了一个类,我想在C#中实例化并调用其成员函数.到目前为止,我设法实例化了这个类:
CFoo Bar = new CFoo();
Run Code Online (Sandbox Code Playgroud)
但是当我尝试在其上调用函数时,编译器说,它不可用.
此外,当我在调试器中检查对象时,不会显示任何成员.
我在这里错过了什么?
我有几个命令行应用程序,最终都调用com对象.他们可以访问从命令行传递的参数,而不是为这些com对象添加新接口吗?
编辑:排序我如何调用GetModuleFileName来获取文件名.我想知道是否有一个等效的方法来获得args.
我有这个代码:
lvItem.pszText = (IntPtr)(lpRemoteBuffer + Marshal.SizeOf(typeof(LV_ITEM)));
Run Code Online (Sandbox Code Playgroud)
它在4.0上工作正常.
如果我将项目降级到3.5,它会给我这个错误:
Operator '+' cannot be applied to operands of type 'System.IntPtr' and 'int'
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题,让它在3.5上工作
我不知道为什么它在4.0中有效?
提前致谢
我正在使用在Ubuntu 12 x64上运行的Mono 2.10.现在我需要知道如何使用非托管代码.
[DllImport("libc.so")]
public static extern int getpid ();
Run Code Online (Sandbox Code Playgroud)
而且,在下一步我有:
getpid();
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误
$ MONO_LOG_LEVEL="debug" MONO_LOG_MASK="dll" mono libc_test.exe
Mono: DllImport attempting to load: 'libc.so'.
Mono: DllImport loading library: '/home/ibaranov/Documents/MONO/libc_test/libc_test/bin/Debug/libc.so'.
Mono: DllImport error loading library '/home/ibaranov/Documents/MONO/libc_test/libc_test/bin/Debug/libc.so: cannot open shared object file: No such file or directory'.
Mono: DllImport loading library: '/home/ibaranov/Documents/MONO/libc_test/libc_test/bin/Debug/libc.so'.
Mono: DllImport error loading library '/home/ibaranov/Documents/MONO/libc_test/libc_test/bin/Debug/libc.so: cannot open shared object file: No such file or directory'.
Mono: DllImport loading location: 'libc.so'.
Mono: DllImport error loading library: '/usr/lib/x86_64-linux-gnu/libc.so: invalid ELF …Run Code Online (Sandbox Code Playgroud) 基本上,我想做的是让 GetKeyboardLayoutName 返回其他进程的键盘 ID (KLID)。默认情况下,它仅重新运行我的应用程序窗口的键盘 ID。我也尝试了 GetKeyboardLayout 但不幸的是它返回了 HKL(它接受其他窗口的 hwnd)。
或者,如果有一种方法可以将 HKL 转换为 KLID,那也很好,但我怀疑是否存在这样的事情。
那么,我怎样才能实现这一目标呢?我希望能够使用获得的KLID作为LoadKeyboardLayout函数的参数。
所以我知道列表里面保存着数组,所以我需要获取它的未知类型的指针(void *)。使用数组很容易做到:
int[] items;
fixed (void* pointer = items)
{
}
Run Code Online (Sandbox Code Playgroud)
所以我需要对列表做同样的事情
List<int> items;
fixed (void* pointer = items)
{
}
Run Code Online (Sandbox Code Playgroud)
这段代码似乎不起作用。我不想将列表复制到新数组,我想访问指向其内部数组的指针
我在WinDbg命令中运行转储文件
地址-摘要
我的结果是这样的
Usage Summary RgnCount Total Size %ofBusy %ofTota
Free 3739 7ff5`dbbae000 ( 127.960 Tb) 99.97%
<unknown> 1677 5`680a1000 ( 21.626 Gb) 53.31% 0.02%
Heap 20349 4`0049f000 ( 16.005 Gb) 39.45% 0.01%
Stack 230 0`a3e90000 ( 2.561 Gb) 6.31% 0.00%
Run Code Online (Sandbox Code Playgroud)
如何在堆中找到内容?什么是对象或什么是类型?
是托管堆,而堆是托管堆?
很难问这样的问题,所以我添加了更多信息
这是我的C#示例代码
class Program
{
public static int[] arr;
public static AllocateUnmanagedMemory cls;
static void Main(string[] args)
{
const int GBSize = 1 * 1024 * 1024 * 1024/ sizeof(int);
Console.WriteLine("Allocating");
arr = new int[GBSize];
cls = …Run Code Online (Sandbox Code Playgroud) 我有一个原生的C++ DLL,一些头文件和导入库.有没有办法如何在dll中定义的C#中实例化对象?
我所知道的两种方式是: