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

Posted

技术标签:

【中文标题】从 C# 程序访问 C++ DLL 中的多个函数【英文标题】:Accessing more than one functions in C++ DLL from C# program 【发布时间】:2018-05-14 12:03:59 【问题描述】:

我在 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,版本=1.0.0.0,文化=中性, PublicKeyToken=null' 因为方法 'printDB' 没有 实施(无 RVA)。

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

如果我改变功能减速的顺序,其他功能也会得到同样的错误。

这些是我的问题

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

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

【问题讨论】:

每个导入函数都应该有自己的 DllImport 属性 【参考方案1】:

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);
        
    

【讨论】:

感谢 Paul Belanger。

以上是关于从 C# 程序访问 C++ DLL 中的多个函数的主要内容,如果未能解决你的问题,请参考以下文章

从c#访问c++ dll库[重复]

MFC dll 中的访问冲突(用 C++/CLI 包装)从 C# 程序开始

如何从 C# 中的 C++ dll 中的全局变量从函数中获取返回数组?

如何通过 C# 从 C++ dll 调用 struct 中的函数

从 c# 访问 C++ .lib 库

嵌入式单声道:将数组从 C# DLL 返回/复制到 C++