从C#程序的DLL访问方法

我有一个C程序,我已经创建了一个DLL文件。 我使用的是Windows Vista和Visual C ++。

现在我需要从C#代码的Main()方法访问该DLL的方法。 这样做的步骤是什么?

到目前为止,我已添加DLL文件作为参考,此后我该怎么办?

这只是一个例子:

int main1( void ) { prinf("Hello World"); } 

请注意,这个类也使我们使用其他.lib函数,但我能够成功地创建一个DLL。 (我不知道这是否相关)

现在我需要从我的C#Main()访问此方法;

 [STAThread] static void Main() { // I need to call that main1() method here Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); } 

请参阅c#代码中使用c ++ dll中定义的类,该代码具有很好的接受答案。 正如Hans Passant在评论中所写,您不能添加本机DLL作为C#项目的引用。

当我引用我自己的一个本机DLL时,我通常会在C#项目和生成本机DLL的项目之间添加依赖项,或者我将DLL作为链接内容文件添加到C#项目中,如下所示:

  1. 右键单击项目,然后选择“添加”>“现有项”。
  2. 浏览并选择所需的DLL,但不要单击“ 添加”
  3. 单击“ 添加”按钮右侧的小箭头,然后选择“ 添加为链接”
  4. 选择现在出现在C#项目中的DLL并转到其属性。
  5. 确保将Build Action设置为Content

这会将DLL复制到C#项目的bin\Debug文件夹中,并确保如果您曾经决定创建安装项目,则可以轻松引用所有内容文件并将其包含在Microsoft Installer程序包中。

现在,为了能够看到在本机DLL中编写的函数,您必须注意导出它们(请参阅导出C函数以在C或C ++语言可执行文件中使用以及使用__declspec(dllexport)从DLL导出 )。 所以你必须在你的函数声明周围添加一个extern "C"块(我假设你在.cpp源文件中编写了代码,这意味着如果你没有将它们声明为编译器将会发出错误的函数名称extern "C" ):

 extern "C" { __declspec (dllexport) void __cdecl Foo(const char* arg1); } ... void Foo(const char* arg1) { printf ("Hello %s !", arg1); } 

__declspec (dllexport)修饰意味着编译器/链接器必须使该函数从DLL外部可见。 __cdecl定义了如何将参数传递给函数(标准的“C”方式)。

在C#代码中,您必须引用DLL的导出方法:

 class Program { [DllImport("mydll.dll")] internal static extern void Foo(string arg1); static void Main() { Program.Foo ("Pierre"); } } 

您应该阅读平台调用教程 ,该教程提供了所有详细信息。

您正在寻找平台调用和[DllImport]属性。

你需要阅读P / Invoke aka pinvoke又名“平台调用”:

http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx