如何导出旧的C dll以便在C#类库中使用

时间:2016-01-15 21:07:03

标签: c++ c dll export console-application

有两个旧C 文件,其中包含两个相关的标题 为了在Visual Studio 2013中使用它,我从项目属性创建了Visual C++ Win32 Console Application并禁用了预编译的头文件 我删除了stdafx.h& targetver.h& dllmain.cpp&& project_name.cpp(created by vs)
Header Files区域,我添加了两个文件。在Source Files区域,我添加了另外两个文件 我的项目看起来像这样:

[my project]

Here is my entire project's link

考虑.c个文件扩展名(否.cpp) 在标头文件中没有class用法,因为旧的c语言,你会看到很多structs
现在我想导出这个项目的dll,以便在一个简单的控制台应用程序c#项目中使用 怎么办?
我把这段代码放在两个头文件的上面:

__declspec(dllexport) int main();

int main()函数位于wmm_file.c文件中,此主函数在另一个c文件(GeomagnetismLibrary.c)中使用许多函数。
我想在c#代码中使用c ++项目的所有函数 这是我的c#代码(Prpogram.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
    class Magnetic_Model_CSharp

        [DllImport(@"Y:\Magnetic_Model_C_dll_2.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern int main();

        static void Main(string[] args)
        {
            main();
        }
    }
}

以下是运行后的错误:

  

“System.AccessViolationException”类型的未处理异常   发生在Magnetic_Model_CSharp.exe

如何修复此错误并使该c(c ++)项目可导出?

编辑:
正如我的朋友所说,你不应该使用main关键字,所以我重新命名了它 对于测试我创建了一个简单的
声明:

int Add(int a, int b); /* PUT IT ON GeomagnetismHeader.h FILE*/

定义:

int Add(int a, int b) /* PUT IT ON wmm_file.c FILE > I RENAMED main() TO main_____() IN THIS FILE*/
{
    printf("Hello Joy!\r\n");
    return a + b;
}

并重命名

__declspec(dllexport) int main(); 

__declspec(dllexport)  

在两个头文件中。
现在问题是在int Add(int a, int b);文件中声明GeomagnetismHeader.h函数的位置 当我把它放在 typedef struct {之前它起作用 但是当我把它放在 typedef struct {不起作用并且我的所有声明都在 typedef struct {之后。 有什么想法吗?

0 个答案:

没有答案