从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。感谢。
答案 0 :(得分:8)
如果DLL是C#DLL,则不要使用P / Invoke来“链接”它。
只需将其添加为项目的引用,然后在要使用它的类的顶部添加:
using WMIQuery_Namespace;
然后你可以直接做:
var port = WMIQuery.GetPortName();
根本不需要“客户”方面的任何代码......
至于:
但应用程序的要求要求在运行时动态加载。感谢。
意识到在应用程序使用它之前不会加载程序集。 CLR中的程序集在启动时不会加载,而是在程序集中使用第一种类型时加载。没有必要尝试通过P / Invoke加载它以实现后期绑定。
如果你不相信这一点,你总是可以使用Assembly.Load和反射来调用成员,但是平台调用服务不能用于加载C#程序集。
答案 1 :(得分:1)