从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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我的应用程序中的界面的外观:
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();
}
}
}
Run Code Online (Sandbox Code Playgroud)
一切都编译没有任何错误或警告,但当我尝试从我的应用程序调用这些函数时,抛出此异常:
"无法在DLL'WMIQuery.dll'中找到名为'ScanForAdapters'的入口点."
我究竟做错了什么?我知道我可以添加WMIQuery作为参考,但我需要将其链接为非托管DLL.谢谢.
如果DLL是C#DLL,则不要使用P/Invoke来"链接"它.
只需将其添加为项目的引用,并在要使用它的类的顶部添加:
using WMIQuery_Namespace;
Run Code Online (Sandbox Code Playgroud)
然后你可以直接做:
var port = WMIQuery.GetPortName();
Run Code Online (Sandbox Code Playgroud)
根本不需要"客户"方面的任何代码......
至于:
但是应用程序的要求要求它在运行时动态加载.谢谢.
实现在应用程序使用它之前不会加载程序集.CLR中的程序集在启动时不会加载,而是在程序集中使用第一种类型时加载.不需要尝试通过P/Invoke加载它以实现后期绑定.
如果您不相信这一点,则可以始终使用Assembly.Load和reflection来调用成员,但Platform Invocation服务不能用于加载C#程序集.
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |