如何使用Marshal类编译C ++ DLL

时间:2012-09-03 14:20:19

标签: dll c++-cli

我昨天刚刚开始使用C ++而且我坚持认为这是一个微不足道的问题。主DLL类生成错误C2653:'Marshal':不是类或命名空间名称

我非常确定我在使用此类时几乎逐字地从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页面但没有成功。我错过了什么?

1 个答案:

答案 0 :(得分: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..