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

时间:2010-10-26 15:16:27

标签: c# .net 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;
        }
    }
}

这就是我的应用程序界面的外观:

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。感谢。

2 个答案:

答案 0 :(得分:8)

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

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

using WMIQuery_Namespace;

然后你可以直接做:

var port = WMIQuery.GetPortName();

根本不需要“客户”方面的任何代码......


至于:

  

但应用程序的要求要求在运行时动态加载。感谢。

意识到在应用程序使用它之前不会加载程序集。 CLR中的程序集在启动时不会加载,而是在程序集中使用第一种类型时加载。没有必要尝试通过P / Invoke加载它以实现后期绑定。

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

答案 1 :(得分:1)

这是否满足您的需求?

http://www.codeproject.com/KB/cs/csharpreflection.aspx

克里斯