0

我有一个 project.dll 和头文件。它是这样定义的:

#ifdef PPSDK_EXPORTS
#define PP_SDK_API __declspec(dllexport)
#else
#define PP_SDK_API __declspec(dllimport)
#endif
#ifndef __PP_SDK__
#define __PP_SDK__

typedef enum
{
    PP_FALSE= 0x0,
    PP_TRUE = 0x01
} pp_bool;

PP_SDK_API pp_bool SDK_Initialize(unsigned long*p_Status );

我在谷歌和这个网站上使用了一些帮助来在 C# 中使用这个 dll,但它没有成功。这是 pp_bool 类型的错误。这是我的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        [DllImport("project.dll")]
        static extern  pp_bool  SDK_Initialize(unsigned long*p_Status );
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

...................................您能帮我处理一下吗?谢谢!

4

1 回答 1

0

您的 P/Invoke 定义不起作用,因为pp_boolC# 中不存在该类型。问题是 an 的大小enum是由 C++ 中的编译器决定的,所以我们不能确定大小是多少。它可能是byte一个shorton an int。虽然如果它在 Visual C++ 中编译为 C 代码,它看起来就像是一个int. 我的建议是尝试其中的每一个并确定哪些有效。

您还可以尝试将返回值声明为bool自然的 .NET 类型。但是默认情况下,假定返回值为 32 位(int 大小)。

Windows 上 C++ 中的 P/Invoke 定义中还有另一个错误,long它是 32 位值,而在 .NET 中,along是 64 位。所以你p_Status应该uint不是unsigned long

此外,如果他SDK_Initialize的函数只返回一个unsigned long值,则不需要使用指针。请改用ref参数。编组器将负责转换,您不必使用不安全的代码。

最后,您需要移动您的 p/Invoke 定义。该[STAThread]属性应该在Main()方法上,而不是在您的 p/Invoke 定义上。更不用说文档注释Main()正在应用于SDK_Initialize.

所以它应该是这样的:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace WindowsFormsApplication1
{
    static class Program
    {
        [DllImport("project.dll")]
        static extern bool SDK_Initialize(ref uint p_Status );

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}
于 2013-06-05T02:55:20.753 回答