【发布时间】:2010-10-26 15:16:26
【问题描述】:
从 C# 应用程序链接到 C# DLL 中的函数的正确方法是什么?
这是我的 DLL 的外观:
namespace WMIQuery_Namespace
{
public class WMIQuery
{
public static string GetPortName()
{
/* Does some stuff returning valid port name. */
return string.Empty;
}
public static int ScanForAdapters()
{
/* Does some stuff returning valid adapter index. */
return _index = -1;
}
}
}
这是我的应用程序界面的外观:
namespace MyApp_Namespace
{
class MyApp_Class
{
internal static class WMIQuery
{
[DllImport("WMIQuery.dll")]
internal static extern string GetPortName();
[DllImport("WMIQuery.dll")]
internal static extern int ScanForAdapters();
}
}
}
一切都编译时没有任何错误或警告,但是当我尝试从我的应用程序调用这些函数时,会抛出此异常:
"找不到名为的入口点 DLL 中的“ScanForAdapters” 'WMIQuery.dll'。”
我做错了什么?我知道我可以添加 WMIQuery 作为参考,但我需要将其链接为非托管 DLL。谢谢。
【问题讨论】:
-
必须链接它,还是可以将 DLL 引用导入到 Visual Studio 项目中?
-
@Daniel:为了清楚起见,我更新了问题。它需要被链接。
-
如果你能解释为什么你不想添加
WMIQuery作为参考,这将更容易回答。 -
不是直接的答案,但如果您阅读Portable Executable 格式(Windows 上的 EXE 和 DLL 文件的文件格式)以及如何使用a .NET Assembly DLL that you create with C# is different from a vanilla PE DLL,事情可能会更清楚。 P/Invoke 适用于普通 PE DLL;要调用 .NET 程序集 DLL 中的方法,您需要使用 .NET 机制。
-
@Daniel:谢谢,这有点帮助。