如何在我的C#应用程序中添加对基于C的DLL的引用?

如何在我的C#应用程序中添加对基于C的DLL的引用?,c#,c,dll,pinvoke,dllimport,C#,C,Dll,Pinvoke,Dllimport,我使用Microsoft Visual Studio 2008创建了一个C#应用程序,现在我想使用一个基于C的DLL 如何将对基于C的DLL的引用添加到Visual Studio 2008中的C#应用程序中?您不能在C#或VB.NET项目中添加对本机(非托管)DLL的引用。这根本不受支持。引用仅适用于其他托管DLL(即,您可能使用C#或VB.NET甚至C++/CLI编写的DLL) 但是,您仍然可以使用该DLL中的代码。诀窍是使用与从Win32 API调用函数相同的P/Invoke语法在运行时动态

我使用Microsoft Visual Studio 2008创建了一个C#应用程序,现在我想使用一个基于C的DLL


如何将对基于C的DLL的引用添加到Visual Studio 2008中的C#应用程序中?

您不能在C#或VB.NET项目中添加对本机(非托管)DLL的引用。这根本不受支持。引用仅适用于其他托管DLL(即,您可能使用C#或VB.NET甚至C++/CLI编写的DLL)

但是,您仍然可以使用该DLL中的代码。诀窍是使用与从Win32 API调用函数相同的P/Invoke语法在运行时动态调用它提供的函数

例如,假设您使用C++将以下代码编译成DLL:

extern "C" {
__declspec(dllexport) void AddNumbers(int a, int b, int* result)
{
    *result = (a + b);
}
}
现在,假设您将该DLL编译为一个名为
test.DLL
的文件,您可以通过向C#应用程序添加以下代码来调用该函数:

[DllImport("test.dll"), CallingConvention=CallingConvention.Cdecl)]
private static extern void AddNumbers(int a, int b, out int result);

public int AddNumbers_Wrapper(int a, int b)
{
    int result;
    AddNumbers(a, b, out result);
    return result;
}
或者在VB.NET中,因为您显然正在使用它(尽管问题中有各种指示):

_
公共共享函数addNumber(ByVal a为整数,ByVal b为整数_
ByRef结果(作为整数)
端函数
公共函数AddNumbers_Wrapper(ByVal a为整数_
ByVal b作为整数)作为整数
将结果设置为整数
添加编号(a、b、结果)
返回结果
端函数
确保根据非托管方法的调用约定,适当设置了
DllImport
属性的字段


介绍如何在Microsoft网站上开始使用p/Invoke。

您不能在C#或VB.NET项目中添加对本机(非托管)DLL的引用。这根本不受支持。引用仅适用于其他托管DLL(即,您可能使用C#或VB.NET甚至C++/CLI编写的DLL)

但是,您仍然可以使用该DLL中的代码。诀窍是使用与从Win32 API调用函数相同的P/Invoke语法在运行时动态调用它提供的函数

例如,假设您使用C++将以下代码编译成DLL:

extern "C" {
__declspec(dllexport) void AddNumbers(int a, int b, int* result)
{
    *result = (a + b);
}
}
现在,假设您将该DLL编译为一个名为
test.DLL
的文件,您可以通过向C#应用程序添加以下代码来调用该函数:

[DllImport("test.dll"), CallingConvention=CallingConvention.Cdecl)]
private static extern void AddNumbers(int a, int b, out int result);

public int AddNumbers_Wrapper(int a, int b)
{
    int result;
    AddNumbers(a, b, out result);
    return result;
}
或者在VB.NET中,因为您显然正在使用它(尽管问题中有各种指示):

_
公共共享函数addNumber(ByVal a为整数,ByVal b为整数_
ByRef结果(作为整数)
端函数
公共函数AddNumbers_Wrapper(ByVal a为整数_
ByVal b作为整数)作为整数
将结果设置为整数
添加编号(a、b、结果)
返回结果
端函数
确保根据非托管方法的调用约定,适当设置了
DllImport
属性的字段


关于如何在Microsoft网站上开始使用p/Invoke。

您尝试了什么?您阅读了哪些文档,文档中有哪些内容您不理解?您尝试了哪些内容?您阅读了哪些文档,哪些文档中您不了解?我下载了该组件。我怎样才能在我的简历中添加那个pinvokeVB2008@panchalbhargav例如我不知道。我从未使用过他们的工具,因为我发现自己编写定义更容易;我在那个网站上发现了很多错误。你试过阅读PInvoke网站上的说明吗?你不需要PInvoke.net组件,有VB.net语法的示例哦,你在使用VB.net?问题清楚地说是C#,甚至在我编辑它之前。。。我将把这两个都添加到我的答案中。@cody您需要使调用约定与upI下载该组件相匹配。我怎样才能在我的简历中添加那个pinvokeVB2008@panchalbhargav例如我不知道。我从未使用过他们的工具,因为我发现自己编写定义更容易;我在那个网站上发现了很多错误。你试过阅读PInvoke网站上的说明吗?你不需要PInvoke.net组件,有VB.net语法的示例哦,你在使用VB.net?问题清楚地说是C#,甚至在我编辑它之前。。。我会把这两个都加到我的答案中。@cody你需要让通话约定匹配起来