C# 调用C++/来自C的CLI代码#

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#和托管C++)。C#项目需要调用ManagedCPP项目中的方法。在c#项目的参考部分,添加了托管cpp dll

如果第1、2和3行未注释,第4行已注释,则还会出现以下问题:

未处理的异常:System.BadImageFormatException

代码库如下所示:

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()
{
}