我在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)如果不是预期的行为我做错了什么?
答案 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);
}
}
}