C# 调用C++/来自C的CLI代码#
有两个项目(C#和托管C++)。C#项目需要调用ManagedCPP项目中的方法。在c#项目的参考部分,添加了托管cpp dll 如果第1、2和3行未注释,第4行已注释,则还会出现以下问题: 未处理的异常:System.BadImageFormatException 代码库如下所示:C# 调用C++/来自C的CLI代码#,c#,visual-c++,.net-3.5,c++-cli,interop,C#,Visual C++,.net 3.5,C++ Cli,Interop,有两个项目(C#和托管C++)。C#项目需要调用ManagedCPP项目中的方法。在c#项目的参考部分,添加了托管cpp dll 如果第1、2和3行未注释,第4行已注释,则还会出现以下问题: 未处理的异常:System.BadImageFormatException 代码库如下所示: C#类: using System.Runtime.InteropServices; using ManagedCPP; namespace CSharp { class Program { //[Dll
C#类:
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类(.h):
C++/CLI类(.cpp):
我不是这方面的专家,但您应该使用DllImport访问非CLI程序集,而CLI可以直接在C中使用,就好像它是本机程序集一样(使用公共接口的优点)。确保您的本机代码(C++)是以相同的格式(32位或64位)编译的作为C#应用程序的.Net执行格式(32位或64位)。这可能是您的问题的原因
默认情况下.Net以与操作系统相同的格式执行自身。通过在visual studio中设置编译选项,可以强制以所选格式执行。注释行用于从非托管Dll IPF\U ManagedCPP调用未损坏的API Convert。实际上,IPF_ManagedCPP是托管Dll,Convert是托管类方法。当然,这是行不通的
C++/CLI类库应由客户端.NET代码使用,与任何其他类库完全相同。非托管Dll可以通过两种方式在.NET项目中使用:使用PInvoke或使用C++/CLI包装器。IPF#U ManagedCPP库不需要PInvoke。请参阅此处的
BadImageFormatException
文档:我将C#project的平台目标从任何CPU更改为x86,它现在正在工作。但问题是什么。c++/cli是否仅编译为x86,因为我没有看到为c++/cli项目配置目标平台的任何选项。为什么不从c++/cli项目向输出程序集添加.net引用,并将P/Invoke排除在外?您似乎没有控制封送处理或类似的操作……我将C#project的平台目标从Any CPU
更改为x86
,它现在正在工作。但问题是什么。c++/cli是否编译为x86
,只是因为我没有看到为c++/cli项目配置目标平台的任何选项。这是可能的。这里描述。
namespace ManagedCPP
{
public ref class ManagedCPPEntryClass
{
public:
void Convert();
};
}
#include "ManagedCPP.h"
using namespace ManagedCPP;
void ManagedCPPEntryClass::Convert()
{
}