如何调用 C++ 中定义的函数来自 C# 代码内部的具有 int * 类型参数的 DLL?

发布于 2024-10-15 21:05:47 字数 344 浏览 2 评论 0原文

我有一个本机常规 C++ Dll,我想从 C# 代码调用它,因此我创建了 C++/CLI 类(如所述 此处此处),其中将包括托管C++ 代码,可以由任何 C# 代码直接调用,并且可以依次调用本机非托管 C++。

本机 C++ dll 中的函数之一具有 int * 类型的参数。如何在包装函数中声明以及如何将其转换为 int *?

I have a native regular C++ Dll which I want to call from C# code, so i created C++/CLI class (as described here and here) which will include managed C++ code and which can be called by any C# code directly and which can make calls inturn to native unmanaged C++.

One of function in native C++ dll has parameter of type int *. How do I declare in wrapper function and how can i convert it into int *?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

别再吹冷风 2024-10-22 21:05:47

它是通过引用传递值的 C/C++ 方式。您应该使用 refout 关键字:

[DllImport("something.dll")]
private static extern void Foo(ref int arg);

在 C++/CLI 中,大致如下所示:

public ref class Wrapper {
private:
    Unmanaged* impl;
public:
    void Foo(int% arg) { impl->Foo(&arg); }
    // etc..
};

It is the C/C++ way of passing a value by reference. You should use the ref or out keyword:

[DllImport("something.dll")]
private static extern void Foo(ref int arg);

In C++/CLI that would look roughly like this:

public ref class Wrapper {
private:
    Unmanaged* impl;
public:
    void Foo(int% arg) { impl->Foo(&arg); }
    // etc..
};
み青杉依旧 2024-10-22 21:05:47
[DllImport("some.dll")]
static extern void SomeCPlusPlusFunction(IntPtr arg);

IntPtr 是一种大致相当于 void * 的类型。

根据您的评论,您最好这样做(C#):

int size = 3;
fixed (int *p = &size) {
    IntPtr data = Marshal.AllocHGlobal(new IntPtr(p));
    // do some work with data
    Marshal.FreeHGlobal(data); // have to free it
}

但由于 AllocHGlobal 可以采用 int,我不知道您为什么不这样做:

IntPtr data = Marshal.AllocHGlobal(size);
[DllImport("some.dll")]
static extern void SomeCPlusPlusFunction(IntPtr arg);

IntPtr is a type that is roughly equivalent to void *.

From your comment, you'd be best off doing something like this (C#):

int size = 3;
fixed (int *p = &size) {
    IntPtr data = Marshal.AllocHGlobal(new IntPtr(p));
    // do some work with data
    Marshal.FreeHGlobal(data); // have to free it
}

but since AllocHGlobal can take an int, I don't know why you wouldn't do this:

IntPtr data = Marshal.AllocHGlobal(size);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文