首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++ cli从非托管代码调用托管代码

C++ cli从非托管代码调用托管代码
EN

Stack Overflow用户
提问于 2013-12-19 14:04:17
回答 1查看 1.5K关注 0票数 2

我试着学习如何用CLI/C++编写混合代码。

clrHookLib.h

代码语言:javascript
复制
#pragma once
#pragma managed
using namespace System;
namespace clrHookLib {

    ref class MyClass
    {
        // TODO: Add your methods for this class here.
        public:
        static int sum(int a, int b);
    };

}

clrHookLib.cpp

代码语言:javascript
复制
#include "stdafx.h"
#include "clrHookLib.h"

int clrHookLib::MyClass::sum(int a, int b)
{
    return a + b;
}

main.cpp

代码语言:javascript
复制
#include "clrHookLib.h"
#include "Stdafx.h"

#pragma unmanaged

BOOL WINAPI DllMain(
    _In_ HINSTANCE  hInstance,
    _In_ DWORD      Reason,
    _In_ LPVOID     Reserved)
{
    switch (Reason)
    {
        case DLL_PROCESS_ATTACH:
        {
            int b = clrHookLib::MyClass::sum(1, 2);
            std::string str = std::to_string(b);
            MessageBoxA(0, str.c_str, "result from managed code!!", MB_OK);
            break;
        }
    }
}

在填充Visual时,向我显示了一个错误:

代码语言:javascript
复制
Error   2   error C2653: 'clrHookLib' : is not a class or namespace name    C:\Users\*\Documents\Visual Studio 2013\Projects\clrHookLib\clrHookLib\Main.cpp 15  1   clrHookLib
Error   3   error C3861: 'sum': identifier not found    C:\Users\*\Documents\Visual Studio 2013\Projects\clrHookLib\clrHookLib\Main.cpp 15  1   clrHookLib
Error   4   error C3867: 'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str': function call missing argument list; use '&std::basic_string<char,std::char_traits<char>,std::allocator<char>>::c_str' to create a pointer to member C:\Users\*\Documents\Visual Studio 2013\Projects\clrHookLib\clrHookLib\Main.cpp 17  1   clrHookLib

问题是为什么compiller找不到clrHookLib名称空间?我做错什么了?

谢谢。

添加了

我在微软网站上找到了一些代码。它可能对某些人有用:

代码语言:javascript
复制
// initializing_mixed_assemblies.cpp
// compile with: /clr /LD 
#pragma once
#include <stdio.h>
#include <windows.h>
struct __declspec(dllexport) A {
   A() {
      System::Console::WriteLine("Module ctor initializing based on global instance of class.\n");
   }

   void Test() {
      printf_s("Test called so linker does not throw away unused object.\n");
   }
};

#pragma unmanaged
// Global instance of object
A obj;

extern "C"
BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved) {
   // Remove all managed code from here and put it in constructor of A.
   return true;
}

我想,无可奉告

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-19 14:24:06

你用了#pragma unmanaged

因此,您不能在那里使用任何托管代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20683757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档