在C#应用程序的C#DLL中链接函数

Jim*_*ell 1 .net c# dll

从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.谢谢.

Ree*_*sey 8

如果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#程序集.