从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()); }
请参阅c#代码中使用c ++ dll中定义的类,该代码具有很好的接受答案。 正如Hans Passant在评论中所写,您不能添加本机DLL作为C#项目的引用。
当我引用我自己的一个本机DLL时,我通常会在C#项目和生成本机DLL的项目之间添加依赖项,或者我将DLL作为链接内容文件添加到C#项目中,如下所示:
- 右键单击项目,然后选择“添加”>“现有项”。
- 浏览并选择所需的DLL,但不要单击“ 添加” 。
- 单击“ 添加”按钮右侧的小箭头,然后选择“ 添加为链接” 。
- 选择现在出现在C#项目中的DLL并转到其属性。
- 确保将Build Action设置为Content 。
这会将DLL复制到C#项目的bin\Debug
文件夹中,并确保如果您曾经决定创建安装项目,则可以轻松引用所有内容文件并将其包含在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); }
__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"); } }
您应该阅读平台调用教程 ,该教程提供了所有详细信息。
您正在寻找平台调用和[DllImport]
属性。
你需要阅读P / Invoke aka pinvoke又名“平台调用”:
http://msdn.microsoft.com/en-us/library/aa288468(v=vs.71).aspx