在C#项目中使用C ++ DLL

时间:2010-06-08 07:41:23

标签: c# c++ dll dllimport

我有一个C ++ dll,必须集成到C#项目中。

我想我找到了正确的方法,但调用dll会给我这个错误: System.BadImageFormatException:尝试加载格式不正确的程序。 (HRESULT异常:0x8007000B)

这是dll中的函数:

extern long FAR PASCAL convert (LPSTR filename);

这是我在C#中使用的代码

namespace Test{
public partial class Form1 : Form
{
    [DllImport("convert.dll", SetLastError = true)]
    static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename);

    private void button1_Click(object sender, EventArgs e)
    {
        // generate textfile
        string filename = "testfile.txt";

        StreamWriter sw = new StreamWriter(filename);
        sw.WriteLine("line1");
        sw.WriteLine("line2");
        sw.Close();

        // add checksum
        Int32 ret = 0;
        try
        {
            ret = convert(filename);

            Console.WriteLine("Result of DLL:  {0}", ret.ToString());
        }
        catch (Exception ex)
        {
            lbl.Text = ex.ToString();
        }
    }
}}

有关如何处理此事的任何想法?

非常感谢, 弗兰克

4 个答案:

答案 0 :(得分:4)

尝试将C#代码从AnyCPU切换到x86(在“属性”对话框中)。

答案 1 :(得分:4)

导出的函数使用PASCAL调用约定,在Windows中与stdcall相同。 .Net运行时需要了解这一点,因此请按如下方式修改C#方法签名:

[DllImport("convert.dll", SetLastError = true, CallingConvention=CallingConvention.StdCall)]
static extern Int32 convert([MarshalAs(UnmanagedType.LPStr)] string filename);

答案 2 :(得分:4)

尝试在从DLL导出的函数中使用__stdcall(或WINAPIAPIENTRY)。

答案 3 :(得分:0)

涉及的两个主要步骤是

1-创建C ++ dll

在视觉工作室

**New->Project->Class Library** in c++ template Name of project here is first_dll in visual studio 2010. Now **declare your function as public** in first_dll.h file and write the code in first_dll.cpp file as shown below.

Header File

Cpp File

Check **Project-> Properties -> Configuration/General -> Configuration Type** 
this option should be **Dynamic Library(.dll)** and build the solution/project now.
调试文件夹

中创建

first_dll.dll 文件

2-在C#项目中链接

打开C#项目

Rightclick on project name in solution explorer -> Add -> References -> Browse to path
where first_dll.dll is created and add the file 

在C#项目的顶部添加此行

Using first_dll; 

现在可以使用以下语句在某个函数中访问文件

double var = Class1.sum(4,5);

我将VS2010中创建的C ++项目.dll链接到VS2013中创建的C#项目。它运作良好。