从C#程序的DLL访问方法

ill*_*lep 6 c c# dll visual-c++

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

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

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

这只是一个例子:

int main1( void ) {
  prinf("Hello World");
}
Run Code Online (Sandbox Code Playgroud)

请注意,这个类也使我们使用其他.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());
}
Run Code Online (Sandbox Code Playgroud)

Pie*_*aud 6

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

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

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

这会将DLL复制到bin\DebugC#项目的文件夹中,并确保如果您曾经决定创建安装项目,则可以轻松引用所有内容文件并将其包含在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);
}
Run Code Online (Sandbox Code Playgroud)

__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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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