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)
请参阅c#代码中使用c ++ dll中定义的类,该代码具有很好的接受答案.正如Hans Passant在评论中所写,您不能添加本机DLL作为C#项目的引用.
当我引用我自己的一个本机DLL时,我通常会在C#项目和生成本机DLL的项目之间添加依赖项,或者我将DLL作为链接内容文件添加到C#项目中,如下所示:
这会将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)
您应该阅读平台调用教程,其中提供了所有详细信息.