传递到C代码从C#代码在Visual Studio
我如何从我的C#代码中引用我的C代码混淆。我已经阅读并意识到DLL是有用的,但我不知道如何连接我的DLL。从我的理解,我从我的C代码的DLL?请帮助传递到C代码从C#代码在Visual Studio
C#(Visual Studio代码)
public partial class Form1: Form{
[DllImport("simple.dll", CallingConvention = CallingConvention.Cdec1)]
public static extern void pinfo(string str);
private void button1_Click(object sender, EventArgs e){
pinfo("yay");
}
}
C代码 - simple.c
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
__declspec(dllexport) void pinfo(char* str){
printf("You are in the method %s\n, str);
}
int main(void){
}
我的问题是如何将C代码连接到C#代码因此,“你在方法耶”行打印出来?我不明白如何将dll文件链接到Visual Studio或如何创建dll文件。感谢
有用于获得的P/Invoke(DllImport
)使用.NET的3个主要步骤:
-
出口从C/C++项目的功能。
在Visual C++中,使用
__declspec(dllexport)
和extern "C"
修饰符,分别告诉编译器导出函数的DLL,以便它是由名字可见,并且不碾压名称或者 - 否则编译器将删除如果项目中没有调用者(“死代码移除”),则该函数完全是这样。功能也可以由一个序数,而不是出口,这大概不是你所感兴趣的问题。 -
确保您正在为同一ISA。
当您使用.NET的P/Invoke,您引用的DLL将被加载到托管.NET过程,所以DLL必须建立在相同的CPU指令集作为当前的.NET程序。 .NET项目
AnyCPU
模式在默认情况下运行,但在最近版本的Visual Studio,他们“喜欢”的32位(x86)模式而不是64位(x64/AMD64)。为了避免任何混乱,决定是否要32位或64位模式,并迫使你的.NET项目建设只对ISA,然后设置你的C/C++项目建设为ISA了。 -
确保目标DLL文件位于.NET可执行文件的
PATH
中 - 通常这意味着只需将其与构建的.NET可执行文件放在相同的bin
输出目录中即可。请注意,由于此DLL文件不是.NET程序集,因此没有“项目引用”或“程序集引用”的概念,因此您需要专门配置项目,以便Visual Studio(MSBuild)将复制DLL文件到您的
bin
文件夹 - 您可以通过添加DLL文件,在Solution Explorer中的.NET项目的根,然后选择文件做到这一点,打开属性窗口,然后选择“生成操作:内容。”和“复制到输出目录:始终”。
关于“链接” - 的DLL在编译时没有链接 - 线索是在名称中:“动态链接”:链接在运行时由操作系统不被执行,编译器。
对于P上的更多信息/ Invoke的,我建议你阅读这QA:Why are Cdecl calls often mismatched in the "standard" P/Invoke Convention?
“请注意,您的DllImport声明不正确”中的所有内容都是错误的。非托管函数是cdecl,默认编组很好。 –
不,你错了。默认编组是使用主要字符集来终止空字符数组。在桌面窗口中缺省为ANSI。所有记录。你应该阅读文档。 –
@DavidHeffernan我的错误。我进一步阅读,并误解了文档。我从我的答案中删除了不正确的断言。 – Dai
检查https://stackoverflow.com/questions/11425202/is-it-possible-to-call-ac-function-from -c-net和https://stackoverflow.com/questions/2874603/is-it-possible-to-embed-c-code-in-ac-sharp-project –
你的代码对我来说看起来很好。当你尝试运行它会发生什么? (请注意,您需要首先导出'pinfo'函数)。使用'__declspec(dllexport)' – Dai
@dai我添加了这一行,我不确定如何运行它,因为我有一个visual studio项目,然后是一个与我的visual studio项目无关的simple.c文件,我不确定如何链接它们 – Aak