gpt4 book ai didi

c# - 从 C# 应用程序链接 C# DLL 中的函数

转载 作者:太空宇宙 更新时间:2023-11-03 17:59:23 24 4
gpt4 key购买 nike

从 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();
}
}
}

一切都在没有任何错误或警告的情况下编译,但是当我尝试从我的应用程序调用这些函数时,抛出了这个异常:

"Unable to find an entry point named 'ScanForAdapters' in DLL 'WMIQuery.dll'."

我做错了什么?我知道我可以添加 WMIQuery 作为引用,但我需要将其链接为非托管 DLL。谢谢。

最佳答案

如果 DLL 是 C# DLL,则不要使用 P/Invoke 来“链接”到它。

只需将它添加为对您的项目的引用,然后在您要使用它的类的顶部添加:

using WMIQuery_Namespace;

然后你可以直接做:

var port = WMIQuery.GetPortName();

根本不需要“客户端”中的任何代码...


至于:

but the requirements of the application require that it be loaded dynamically at run-time. Thanks.

意识到程序集在您的应用程序使用它之前不会被加载。 CLR 中的程序集不会在启动时加载,而是在程序集中使用第一个类型时加载。无需尝试通过 P/Invoke 加载它以实现后期绑定(bind)。

如果你不相信这个,你可以随时使用 Assembly.Load和反射来调用成员,但平台调用服务不适用于加载 C# 程序集。

关于c# - 从 C# 应用程序链接 C# DLL 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4025116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com