C# 从C程序的DLL访问方法

C# 从C程序的DLL访问方法,c#,c,visual-c++,dll,C#,C,Visual C++,Dll,我有一个C程序,我已经创建了一个DLL文件。我使用的是Windows Vista和Visual C++。 现在我需要从DLL访问一个方法,从C代码的主方法。这样做的步骤是什么 到目前为止,我已经添加了DLL文件作为参考,此后我应该怎么做 这只是一个例子: int main1( void ) { prinf("Hello World"); } 请注意,这个类也使我们有了其他的.lib函数,但我成功地用它创建了一个DLL。我不知道这是否相关 现在我需要从我的C Main访问这个方法 [STAT

我有一个C程序,我已经创建了一个DLL文件。我使用的是Windows Vista和Visual C++。 现在我需要从DLL访问一个方法,从C代码的主方法。这样做的步骤是什么

到目前为止,我已经添加了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());
}
您正在查找和[DllImport]属性。

您需要阅读p/Invoke aka pinvoke aka Platform Invoke:

看看哪一个答案是公认的。正如Hans Passant在评论中所写,您不能添加本机DLL作为对C项目的引用

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

右键单击项目并选择“添加”>“现有项”。 浏览并选择所需的DLL,但不要单击“添加”。 单击“添加”按钮右侧的小箭头,然后选择“添加为链接”。 选择现在显示在C项目中的DLL并转到其属性。 确保已将生成操作设置为内容。 这会将DLL复制到C项目的bin\Debug文件夹中,并确保一旦决定创建安装项目,就可以轻松地引用所有内容文件并将其包含在Microsoft Installer包中

现在,为了能够看到在本机DLL中编写的函数,您必须注意导出它们并查看。因此,您必须在函数声明周围添加一个extern C块。我假设您在.cpp源文件中编写代码,这意味着如果您不将函数名声明为extern C,编译器将发出损坏的函数名:

_u_declspecdllexport装饰意味着编译器/链接器必须使函数从DLL外部可见。而_cdecl定义了参数将如何通过标准的C方式传递给函数

在C代码中,必须参考DLL的导出方法:

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

    static void Main()
    {
        Program.Foo ("Pierre");
    }
}

您应该阅读提供了所有详细信息的。

添加对本机C DLL的引用是不可能的。显然,您没有使用真正的C dll,可能是C++/CLI。在这种情况下不需要任何特殊的东西,您公开的ref类声明可以直接在C程序中使用。是的,它是一个C++/CLI项目。根据你的回答,这似乎可以直接做到,你说的“ref class”是指我的C类吗?我该如何公开?到目前为止,我所做的步骤是,添加dll作为引用,并使用detect.h添加以下语句,并尝试从C访问它,Main方法如下;detect.u方法是我需要的,但它不是那样工作的。HELPHello@Pierre,我遵循了您的步骤,我不确定如何将内容设置为Build Action,但是,当我编译代码时,在我的C项目的bin\Debug中没有找到我的DLL副本。希望您能在这里帮助我,您也能告诉我如何访问我从C项目的主方法中添加的DLL的方法。@illep:单击C项目中的DLL文件,按F4。在“属性工具”窗口中,第一行标记为“生成操作”。单击其右侧,选择内容。请确保将“复制到输出目录”设置为“复制”选项之一。@illep:编辑您的帖子,并添加您希望访问的C代码示例。你必须确保你的C函数是用一个DLL导出指令正确修饰的。我已经用一个示例代码编辑了我的文章,请帮助我。干杯是的,我已经阅读了一些关于这方面的教程,但我不明白公共静态外部是什么意思。我无法编辑我的C代码,已经使用Visual C++编写。无论如何,我有一个DLL文件的代码。例如,考虑下面的代码段;void main{printfHELLO WORLD;}上面是我的C代码,它现在是一个DLL,如何从我的C main方法访问这个main。我基本上想要执行我的c代码的主要部分。救命啊@illep:如果你不能修改你的DLL,那你就走运了——函数必须被导出,这样才能从外部世界访问它们。如果您的DLL是一个伪装成EXE的主函数,您可以使用System.Diagnostics.Process.Start执行该DLL。@Pierre是的,我已经尝试过了,但我不想打开控制台。还有什么可以避免这种情况吗?@illep:是的,您可以在隐藏模式下启动控制台应用程序,使用ProcessStartInfo并指定WindowStyle=ProcessWindowStyle.hidden。我执行了以下操作/n`[DllImportdetect.dll]internal static extern int main1;`,detect.dll是我创建的dll的名称。main1是我的方法 希望从我的C代码中执行。现在,我用C代码调用main1;方法和我得到一个错误DLL not found exception,但该DLL位于bin\Debug文件夹中。我如何解决这个问题。注意:这就是我添加DLL的方式,右键单击项目并添加引用->选择DLL
class Program
{
    [DllImport("mydll.dll")]
    internal static extern void Foo(string arg1);

    static void Main()
    {
        Program.Foo ("Pierre");
    }
}