有两个项目(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()
{
}
答案 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库。