我有一个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());
}
答案 0 :(得分:6)
请参阅using a class defined in a c++ dll in c# code,其中包含一个很好的答案。正如Hans Passant在评论中所写,您不能添加本机DLL作为C#项目的引用。
当我引用我自己的一个本机DLL时,我通常会在C#项目和生成本机DLL的项目之间添加一个依赖项,或者我将这个DLL添加为C#项目中的链接内容文件,就像这样:
这会将DLL复制到C#项目的bin\Debug
文件夹中,并确保如果您曾经决定创建一个安装项目,则可以轻松引用所有内容文件和将它们包含在Microsoft Installer程序包中。
现在,为了能够看到在您的本机DLL中编写的函数,您必须注意导出它们(请参阅Exporting C Functions for Use in C or C++ Language Executables和Exporting 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