将DllImport从c#控制台应用程序中静态类的静态成员转换为c++ CLR控制台应用程序的成员

本文关键字:应用程序 控制台 转换 成员 CLR 静态成员 c++ 静态类 DllImport | 更新日期: 2023-09-27 18:08:53

我有以下内容,我无法移动围绕DllImport的错误

#include "stdafx.h"
#include <msclr/auto_gcroot.h>
using namespace System;
using namespace System::Diagnostics;
using namespace System::Runtime::InteropServices;
using namespace System::Threading;
using namespace System::Collections::Generic;
using namespace System::Text;
namespace WinFlix
{
    class FlickWin
    {
        [DllImport("user32.dll")]
        extern "C" bool SetForegroundWindow(IntPtr hWnd);

我一直在从c#翻译这个类,它是一个static类,在c++ . net中不可用。我的新c++项目的类型是"CLR控制台应用程序"。

错误C2059:语法错误:'string'

错误C2238: ';'前面有一个意外的标记

都是指'extern "C"'行。

我已经搜索了我以前的工作,虽然我与c++/CLI胜任,但我以前没有像这样调用WinAPI函数。这两个错误是唯一打败我的:-/

TBH,这个东西耗尽了我的耐心,我删除了它,可以回去重新创建它,但我更喜欢修复我的c#。

将DllImport从c#控制台应用程序中静态类的静态成员转换为c++ CLR控制台应用程序的成员

外部"C"不适合用于DllImport。

问题是你在一个类中声明了你的p/调用。据我所知,在c++中,它们被声明为任何类之外的自由函数。我没有找到c++/CLI中P/invoke的很多文档,可能是因为c++/CLI不需要P/invoke。

在c++/CLI中不需要p/invoke,因为编译器可以包含标准的c++头文件和指向本地库的链接。只需包含windows.h并调用Win32 api,而无需进一步的努力。

这是正确的c++/CLI函数定义:

<>之前[DllImport("user32.dll")]SetForegroundWindow(IntPtr hWnd);之前

同意David Heffernan的观点,在c++/CLI中使用PInvoke是没有意义的——直接调用API就可以了。PInvoke是为c#/vb.net开发人员准备的。