从C#程序的DLL访问方法

时间:2011-06-17 22:16:37

标签: c# c visual-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());
}

3 个答案:

答案 0 :(得分:6)

请参阅using a class defined in a c++ dll in c# code,其中包含一个很好的答案。正如Hans Passant在评论中所写,您不能添加本机DLL作为C#项目的引用。

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

  1. 右键单击该项目,然后选择添加>现有项目。
  2. 浏览并选择所需的DLL,但不要点击添加
  3. 点击添加按钮右侧的小箭头,然后选择添加为链接
  4. 选择现在出现在C#项目中的DLL并转到其属性。
  5. 确保构建操作设置为内容
  6. 这会将DLL复制到C#项目的bin\Debug文件夹中,并确保如果您曾经决定创建一个安装项目,则可以轻松引用所有内容文件和将它们包含在Microsoft Installer程序包中。

    现在,为了能够看到在您的本机DLL中编写的函数,您必须注意导出它们(请参阅Exporting C Functions for Use in C or C++ Language ExecutablesExporting from a DLL Using __declspec(dllexport))。所以你必须在你的函数声明周围添加一个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");
        }
    }
    

    您应该阅读Platform Invoke Tutorial,其中包含所有血腥细节。

答案 1 :(得分:0)

您正在寻找Platform Invoke[DllImport]属性。

答案 2 :(得分:0)

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

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