Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于C的DLL包装基于C的DLL使用问题_C#_C_Dll_Interop_Wrapper - Fatal编程技术网

C# 基于C的DLL包装基于C的DLL使用问题

C# 基于C的DLL包装基于C的DLL使用问题,c#,c,dll,interop,wrapper,C#,C,Dll,Interop,Wrapper,我有用ANSI C编写的代码,我想在C#中使用。我已将C代码编译成DLL,并创建了C#包装器类以与C代码进行互操作。包装器的目的是简化用户与底层C代码的交互 [DllImport(DLL, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] private static extern void PrintHelloWorld(); public void PrintHelloWorldC() { P

我有用ANSI C编写的代码,我想在C#中使用。我已将C代码编译成DLL,并创建了C#包装器类以与C代码进行互操作。包装器的目的是简化用户与底层C代码的交互

[DllImport(DLL, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
private static extern void PrintHelloWorld();

public void PrintHelloWorldC()
{
    PrintHelloWorld();
}
以上是我迄今为止所做工作的一个简化示例。现在,我正试图从我编写的C#包装器类创建一个DLL。从这里我可以给出创建的DLL,并且有人可以与基于C的DLL交互,从而与底层基于C的DLL交互。下面是我所做的和我遇到的问题

  • 我在Visual Studio 2019中将C代码编译成DLL,配置为Release,平台为Win32
  • 我在VisualStudio2019中使用 配置=发布,平台=Win32,平台目标为x86
  • 我创建了一个新项目,链接了我的C#DLL,并将平台目标设置为x86
  • 我将我的C DLL放入项目的Debug文件夹中,以便C#DLL可以通过marshal指令使用它
  • 我试图调用C#DLL,下面是发生的事件链

  • 程序调用C#DLL方法
    PrintHelloWorldC()
    ,并且成功
  • PrintHelloWorldC()
    中,它尝试调用
    PrintHelloWorld()
  • 出现以下错误:

    System.BadImageFormatException
      HResult=0x8007000B
      Message=An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)
    
    我的研究表明,很可能是DLL和测试项目之间的平台目标不匹配,但是,我仔细检查了所有配置,它们都应该为x86编译

    下面是我所做的额外测试

  • 创建了一个C#项目,并编写了简单的代码直接调用基于C的DLL。这个很好用
  • 看起来,当我试图在另一个项目中使用这两个DLL时,我开始面临问题


    任何帮助或指导都将不胜感激。提前谢谢

    您是否试图在Visual Studio中以单元测试的形式运行此代码?我认为错误是由于对齐问题造成的。你在用CPU吗?AnyCPU默认为32位,并给出64位错误。请参阅以下内容:它将是32/64位mismatch@BlueStrat目前我没有运行单元测试。@jdweng我没有使用AnyCPU,但现在可以将其默认为32位。是否尝试在Visual Studio中作为单元测试运行此代码?我认为错误是由于对齐问题造成的。你在用CPU吗?AnyCPU默认为32位,并给出64位错误。请参阅以下内容:它将是32/64位mismatch@BlueStrat目前我没有运行单元测试。@jdweng我没有使用任何CPU,但现在可以默认为32位。