2017-05-30 77 views
-2

我如何从我的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文件。感谢

+3

检查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 –

+0

你的代码对我来说看起来很好。当你尝试运行它会发生什么? (请注意,您需要首先导出'pinfo'函数)。使用'__declspec(dllexport)' – Dai

+0

@dai我添加了这一行,我不确定如何运行它,因为我有一个visual studio项目,然后是一个与我的visual studio项目无关的simple.c文件,我不确定如何链接它们 – Aak

回答

0

有用于获得的P/Invoke(DllImport)使用.NET的3个主要步骤:

  1. 出口从C/C++项目的功能。

    在Visual C++中,使用__declspec(dllexport)extern "C"修饰符,分别告诉编译器导出函数的DLL,以便它是由名字可见,并且不碾压名称或者 - 否则编译器将删除如果项目中没有调用者(“死代码移除”),则该函数完全是这样。功能也可以由一个序数,而不是出口,这大概不是你所感兴趣的问题。

  2. 确保您正在为同一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了。

  3. 确保目标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?

+0

“请注意,您的DllImport声明不正确”中的所有内容都是错误的。非托管函数是cdecl,默认编组很好。 –

+0

不,你错了。默认编组是使用主要字符集来终止空字符数组。在桌面窗口中缺省为ANSI。所有记录。你应该阅读文档。 –

+0

@DavidHeffernan我的错误。我进一步阅读,并误解了文档。我从我的答案中删除了不正确的断言。 – Dai