从C#调用C ++ / CLI代码

时间:2011-06-16 13:44:22

标签: c# visual-c++ .net-3.5 c++-cli interop

有两个项目(C#和托管C ++)。 C#项目需要在ManagedCPP项目中调用一个方法。在c#项目的参考部分中,添加了托管cpp dll。

如果取消注释第1,2和3行并注释第4行,则还会出现以下问题:

  

未处理的异常:System.BadImageFormatException

代码库如下:

C# class:

using System.Runtime.InteropServices;
using ManagedCPP;

namespace CSharp
{
class Program
{
    //[DllImport("ManagedCPP")]                   // Line 1
    //public static extern void Convert();        // Line 2

    static void Main(string[] args)
    {
        new Program().CreateObject();
    }

    private void CreateObject()
    {
        //Convert();                              // Line 3
        ManagedCPPEntryClass c = new ManagedCPPEntryClass();  // Line 4

        Console.ReadKey();
    }
}
}

C++/CLI class(.h):

namespace ManagedCPP 
{
public ref class ManagedCPPEntryClass
{
    public:
        void Convert();
};
}

C++/CLI class(.cpp):

#include "ManagedCPP.h"
using namespace ManagedCPP;

void ManagedCPPEntryClass::Convert()
{
}

3 个答案:

答案 0 :(得分:4)

确保使用与C#应用程序的.Net执行格式相同的格式(32位或64位)编译本机代码(C ++)(再次为32位或64位)。这可能是您遇到问题的原因。

默认情况下,.Net以与OS相同的格式执行自身。您可以通过在visual studio中设置编译选项来强制以所选格式执行。

答案 1 :(得分:1)

我不是该主题的专家,但您应该使用DllImport访问非CLI程序集,而CLI可以直接在C#中使用,就像它是本机程序集一样(使用通用接口的优势) )。

答案 2 :(得分:1)

注释行用于从非托管Dll IPF_ManagedCPP调用未损坏的API转换。实际上,IPF_ManagedCPP是管理Dll,而Convert是托管类方法。当然,这不起作用。

客户端.NET代码应该使用C ++ / CLI类库,就像任何其他类库一样。非托管Dll可以通过两种方式在.NET项目中使用:使用PInvoke或使用C ++ / CLI包装器。您不需要PInvoke用于IPF_ManagedCPP库。