Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从C应用程序链接C DLL中的函数_C#_.net_Dll - Fatal编程技术网

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

C# 从C应用程序链接C DLL中的函数,c#,.net,dll,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;

从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链接。谢谢。

如果该DLL是C DLL,则不使用p/Invoke链接到它

只需将其添加为对项目的引用,并在类的顶部添加以下内容:

using WMIQuery_Namespace;
然后,您可以直接执行以下操作:

var port = WMIQuery.GetPortName();
客户端根本不需要任何代码

至于:

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

请注意,在应用程序使用程序集之前,不会加载该程序集。CLR中的程序集不会在启动时加载,而是在程序集中使用第一种类型时加载。为了实现后期绑定,不需要尝试通过P/Invoke加载它


如果您不相信这一点,您可以始终使用和反射来调用成员,但平台调用服务无法用于加载C程序集。

如果DLL是C DLL,则不使用p/Invoke链接到它

只需将其添加为对项目的引用,并在类的顶部添加以下内容:

using WMIQuery_Namespace;
然后,您可以直接执行以下操作:

var port = WMIQuery.GetPortName();
客户端根本不需要任何代码

至于:

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

请注意,在应用程序使用程序集之前,不会加载该程序集。CLR中的程序集不会在启动时加载,而是在程序集中使用第一种类型时加载。为了实现后期绑定,不需要尝试通过P/Invoke加载它


如果您不相信这一点,您可以始终使用和反射来调用成员,但平台调用服务无法用于加载C程序集。

这是否满足您的需要


克里斯这能满足你的需要吗



Chris

你必须链接它,还是可以将DLL引用导入到你的Visual Studio项目中?@Daniel:为了清楚起见,我更新了这个问题。它需要链接。如果您能解释为什么不想添加WMIQuery作为参考,回答这个问题会更容易。这不是直接回答,但如果您阅读了Windows上EXE和DLL文件的格式以及如何添加,事情可能会更清楚。P/Invoke针对普通PE DLL工作;若要调用.NET程序集DLL中的方法,您需要使用.NET机制。@丹尼尔:谢谢,这会有所帮助。您必须链接它,还是可以将DLL引用导入到Visual Studio项目中?@丹尼尔:为了清楚起见,我更新了问题。它需要链接。如果您能解释为什么不想添加WMIQuery作为参考,回答这个问题会更容易。这不是直接回答,但如果您阅读了Windows上EXE和DLL文件的格式以及如何添加,事情可能会更清楚。P/Invoke针对普通PE DLL工作;要调用.NET程序集DLL中的方法,您需要使用.NET机制。@Daniel:谢谢,这会有所帮助。我在问题中特别提到,应用程序的要求要求在运行时动态加载它;不能将WMIQuery添加为引用,这是使用WMIQuery_命名空间实现所必需的。@Jim:在实际使用第一种类型之前,不会加载程序集。。。添加引用并不违反您的要求。@吉姆:我也为您提供了唯一的其他真正选项。P/Unjk将不与.NET程序集一起使用。@吉姆:C++应用程序不能链接到C DLL——它可以添加它作为引用,使用C++或CLI,或者它可以承载CLR,或者它可以使用COM。它不能使用LoadLibrary / FrieBrRy,就像一个本地DLL。@吉姆Read:C++只加载C DLL,如果它是管理C++,即C++ +CLI,运行在.NET框架下。唯一的方法是非托管C++代码可以从C DLL加载类,即.NET程序集是使用COM互操作和创建COM实例。然后COM互操作基础结构将加载.NET Framework。基本上,C代码被编译成CLR字节码,在没有CLR运行实例的情况下无法执行;编译到本机的C++没有CLR的运行实例。要在这两个世界之间进行通信,您需要以某种方式弥合这一差距;不能将WMIQuery添加为引用,这是使用WMIQuery_命名空间实现所必需的。@Jim:Ass
直到实际使用第一种类型,才加载emblies。。。添加引用并不违反您的要求。@吉姆:我也为您提供了唯一的其他真正选项。P/Unjk将不与.NET程序集一起使用。@吉姆:C++应用程序不能链接到C DLL——它可以添加它作为引用,使用C++或CLI,或者它可以承载CLR,或者它可以使用COM。它不能使用LoadLibrary / FrieBrRy,就像一个本地DLL。@吉姆Read:C++只加载C DLL,如果它是管理C++,即C++ +CLI,运行在.NET框架下。唯一的方法是非托管C++代码可以从C DLL加载类,即.NET程序集是使用COM互操作和创建COM实例。然后COM互操作基础结构将加载.NET Framework。基本上,C代码被编译成CLR字节码,在没有CLR运行实例的情况下无法执行;编译到本机的C++没有CLR的运行实例。要在这两个世界之间交流,你需要以某种方式弥合这一鸿沟。