从C#程序访问C ++ DLL中的多个函数

时间:2018-05-14 12:04:00

标签: c# c++ dll dllimport

我在Visual C ++ DLL项目中实现了两个函数。这些函数将从C#程序调用。 这些是我在C ++ DLL中的函数(不是实际的实现)。 mytest.cpp项目。

extern "C"
{
    __declspec(dllexport)void print_DB(null *head)
    {
        /*print all nodes*/
        return;
    }

    __declspec(dllexport)void* add_node(void *head, int data)
  {
      /*Add node to data base*/
      return (head);
  }
}

我的C#程序如下。

namespace example
{
    class test
    {
        [DllImport("mytest.dll", CallingConvention = CallingConvention.Cdecl)]

        unsafe public static extern void* add_node(void *head, int data);
        unsafe public static extern void print_DB(void *head);

        unsafe static void Main(string[] args)
        {
            /*initilialization*/
            head = add_node(head, a) 
            head = add_node(head, b) 
            head = add_node(head, c) 
            printDB(head);
        }
    }
}

我一次可以使用on功能。即,如果我评论来自C#程序的print_DB()减速,add_node()功能正在运行。如果我评论add_node()函数print_DB()函数正在工作。通过这种方式,这两个函数都能给出预期的结果。

如果我同时使用这两个函数,那么最后声明的函数会给出错误,如下所示。调用或不调用函数对行为没有任何影响。

  

无法从程序集中加载“ConsoleApplication2.Program”类型   'ConsoleApplication2,Version = 1.0.0.0,Culture = neutral,   PublicKeyToken = null'因为'printDB'方法没有   实施(没有RVA)。

其中“ConsoleApplication2.Program”是我的C#程序的名称。

如果我更改了减速功能的顺序,则其他功能会出现相同的错误。

这些是我的问题

1)我是C#编程的新手。我的期望是这个函数应该工作,无论我们在C#程序中声明了多少函数。这是预期的行为吗?

2)如果不是预期的行为我做错了什么?

1 个答案:

答案 0 :(得分:3)

每个导入的函数声明之前必须存在DllImport行,如下所示:

namespace example
{
    class test
    {
        [DllImport("mytest.dll", CallingConvention = CallingConvention.Cdecl)]
        unsafe public static extern void* add_node(void *head, int data);

        [DllImport("mytest.dll", CallingConvention = CallingConvention.Cdecl)]
        unsafe public static extern void print_DB(void *head);

        unsafe static void Main(string[] args)
        {
            /*initilialization*/
            head = add_node(head, a) 
            head = add_node(head, b) 
            head = add_node(head, c) 
            printDB(head);
        }
    }
}