gpt4 book ai didi

c# - 添加 .dll 作为引用。无法理解错误消息

转载 作者:行者123 更新时间:2023-12-02 04:31:38 25 4
gpt4 key购买 nike

使用 Visual Studio 2008 和 Xna 3.1,我得到了一个硬件“Mindwave”,它的所有代码都在一个 .dll 文件中。我有一个 ThinkGear.cs 文件,它只是一个包装类,它引用 .dll 文件中的所有内容,代码如下:

[DllImport("ThinkGear")]
public static extern int
TG_GetDriverVersion();

评论中给出的描述是这样的:

This ThinkGear class for C# is simply a thin interface layer which uses InteropServices to provide access to the API functions in the TGCD library, allowing C# programs to use the TGCD to communicate with ThinkGear modules.

当我将 .dll 文件作为引用添加到项目中时,我收到此错误消息。

A reference to 'C:\thinkgear.dll' could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.

有谁知道为什么 dll 可能无法导入或如何解决它?我尝试将其添加为内容...不确定这是否是正确的方向。

最佳答案

在 .NET 中,项目引用必须是程序集,在 .NET 中,这意味着托管库或可执行文件。您看到的错误消息是由于您尝试添加对非托管库的引用而导致的,该库不是程序集。

.NET Framework 可以使用平台调用服务(其缩写名称 P/Invoke 更为人所知)来调用非托管库。包装器代码中的 DllImportAttribute 是平台调用服务的一部分。

看看您发布的函数调用:

[DllImport("ThinkGear")]
public static extern int TG_GetDriverVersion();

请注意 extern 关键字。在 C# 中,extern 表示函数体在当前程序集之外的某个位置定义。外面哪里?这就是 DllImport 属性的用途。所以这个函数声明是说,“有一个名为 TG_GetDriverVersion 的函数,它不带参数并返回 int,但我不会为您定义该函数;如果您想要它的完整定义,请找到非托管库“ThinkGear”并查看那里。”

编译器不需要需要引用来解析此方法,因为您已在其中附加了一条注释,上面写着“不要担心它实际上来自哪里;我告诉你它是什么,所以只需按照我声明它的方式使用它,并假设它可以在运行时访问。”

当您执行应用程序并尝试调用 TG_GetDriverVersion() 时,CLR 发现您已使用 extern 对其进行了标记,并检查 DllImport 属性来查看哪个库包含实际代码,在硬盘驱动器中搜索有问题的库(在本例中为 ThinkGear.dll),将该库加载到您的进程中,在库中找到相应的函数并调用它.

只要 CLR 可以找到有问题的库,这一切都应该“正常工作”。因此,您需要做的就是确保应用程序的 bin 目录中存在正确的库,否则,CLR 在尝试调用该函数时将抛出运行时异常。

关于c# - 添加 .dll 作为引用。无法理解错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22914661/

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