从 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 中的多个函数的主要内容,如果未能解决你的问题,请参考以下文章
MFC dll 中的访问冲突(用 C++/CLI 包装)从 C# 程序开始
如何从 C# 中的 C++ dll 中的全局变量从函数中获取返回数组?