2

我昨天刚开始使用 C++,但我被我怀疑是一个微不足道的问题困住了。主 DLL 类生成错误 C2653: 'Marshal': is not a class or namespace name

我很确定我已经从 MSDN 页面中逐字复制了使用此类的语法。这是代码:

// VideoInfoAssembly.cpp
// compile with: /clr

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#include "stdafx.h"
#include "VideoInfoAssembly.h"

#pragma managed

namespace VideoInfoAssembly
{
    short VideoInfo::GetWidth(System::String^ managedString)
    {
        // Marshal the managed string to unmanaged memory. 
        char* stringPointer = (char*) Marshal::StringToHGlobalAnsi(managedString).ToPointer();

        // Always free the unmanaged string.
        Marshal::FreeHGlobal(IntPtr(stringPointer));

        return 9001;
    }
}

概括地说,我有一个 C# 应用程序需要读取视频文件的视频属性,而 Microsoft Media Foundation 需要 C++。我已经成功构建了 DLL,并让它返回超过 9000 作为测试。现在,我正在尝试将托管字符串传递给 DLL(这将是视频文件名);但是,我已经努力了一个多小时才能让 Marshal 类发挥作用。如前所述,我一直在使用MSDN页面但没有成功。我错过了什么?

4

1 回答 1

4

这是由预编译的标头引起的问题。编译器将跳过所有内容,直到找到预编译头文件的#include。您犯的错误是没有放在#include "stdafx.h"文件的顶部。所以像这样修复它:

#include "stdafx.h"             // Has to be first
#include "VideoInfoAssembly.h"

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

// etc..
于 2012-09-03T15:56:06.403 回答