代码之家  ›  专栏  ›  技术社区  ›  Jim Fell

从C应用程序链接C dll中的函数

  •  1
  • Jim Fell  · 技术社区  · 14 年前

    从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 回复  |  直到 14 年前
        1
  •  8
  •   Reed Copsey    14 年前

    如果该dll是C_dll,则不使用p/invoke“链接”到它。

    只需添加它作为对项目的引用,并在要使用它的类的顶部添加:

    using WMIQuery_Namespace;
    

    然后您可以直接执行以下操作:

    var port = WMIQuery.GetPortName();
    

    完全不需要“客户机”端的任何代码…


    至于:

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

    请注意,只有在应用程序使用程序集的时间点之前,才会加载该程序集。clr中的程序集不是在启动时加载的,而是在从程序集中使用第一个类型时加载的。为了实现后期绑定,不需要尝试通过p/invoke加载它。

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

        2
  •  1
  •   Chris    14 年前

    这能满足你的需求吗?

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

    克里斯