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

将DllImport从C#控制台应用程序中静态类的静态成员转换为C+的成员+;CLR控制台应用程序,c#,c++-cli,translation,dllimport,static-classes,C#,C++ Cli,Translation,Dllimport,Static Classes,我有以下几点,我无法改变围绕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 Sys

我有以下几点,我无法改变围绕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);
#包括“stdafx.h”
#包括
使用名称空间系统;
使用名称空间系统::诊断;
使用名称空间System::Runtime::InteropServices;
使用名称空间系统::线程;
使用命名空间System::Collections::Generic;
使用名称空间系统::Text;
名称空间WinFlix
{
类FlickWin
{
[DllImport(“user32.dll”)]
外部“C”bool setforeforgroundindow(IntPtr hWnd);

我一直在从C++中转过这个类,它是一个<代码>静态< /C> >类,它在C++ .NET中不可用。我的新C++项目是“CLR控制台应用程序”。

我明白了

错误C2059:语法错误:“字符串”

错误C2238:在“;”之前出现意外标记

两者都是指“外部“C”行

我已经搜索了我以前的工作,虽然我能够胜任C++/CLI,但我以前不必调用像这样的WinAPI函数。这两个错误是我最头疼的问题:-/

TBH,这件事耗尽了我的耐心,我删除了它,可以返回并重新创建它,但我更喜欢修复我的C#而不是。感谢您的帮助,以供将来参考。

外部“C”不适合DllImport。这是错误的根源

问题是,你在一个类中声明你的P/调用。据我所知,在C++中,它们被声明为任何类之外的自由函数。我没有从C++/CLI中找到很多用于p/jokes的文档,这可能是因为从C++ +CLI不需要P/UncIk。< /P>
不需要用C++ /CLI调用p/inc++,因为编译器可以包含标准的C++头文件,并链接到本地库。只需包含Windows .h,调用Win32 API就可以了。这是C++/CLI的最佳点之一。< /P> < P>这是正确的C++/CLI函数定义:

[DllImport("user32.dll")] static int SetForegroundWindow(IntPtr hWnd); [DllImport(“user32.dll”)] 静态int-setforegroundindow(IntPtr-hWnd);
同意David Heffernan的观点,在C++/CLI中使用PInvoke没有任何意义-直接调用API即可。PInvoke是为C#/VB.NET开发人员提供的。

我没有使用PInvoke,因为我对C#还是新手,并且保持它的“简单”。我现在在另一个项目中使用您的建议,“只包括windows.h”。尝试了一下,因为我的函数被标记了“已声明但未定义”。现在弹出37个其他错误,大部分是歧义,第一个具有代表性的是,“C:\Program Files\Microsoft SDK\Windows\v7.0\include\objidl.h(6143):错误C2872:“IDataObject”:歧义符号“修复了上一个错误,MSDN示例误导我在需要‘extern bool DestroyIcon’时使用‘static bool DestroyIcon’。我之前说过,MS是对的,在某些情况下,原始应用程序,如上所述,是控制台/CLR应用程序。现在我得到的‘extern’对成员来说是非法的。但我可以在外部鞭打它,使它再次成为extern,甚至是‘extern’C”,FWIW!所以你得到了我的投票,但我认为你可能错了,因为“extern”C“”的例子也来自MSDN,现在和其他任何例子一样有效。更关心的是为什么我的main()但现在不能从类内部运行并使用其静态成员。@John是的,你是对的。问题是使用P/invoke作为类成员。我应该已经发现了。你不能将其作为静态成员和外部成员,因为只能使用一个存储类说明符。因此你需要将P/invoke声明为自由函数。但是如果如果您打算使用C++/CLI,您应该充分利用它的强大功能,即无需费力的P/invoke即可调用本机库!