【问题标题】:How to select one of two dlls with the same API at run-time?如何在运行时选择具有相同 API 的两个 dll 之一?
【发布时间】:2017-04-09 19:50:35
【问题描述】:

我有两个具有相同 API 的 dll 访问不同的硬件设备(由我构建)。我想根据在计算机中检测到的硬件在运行时选择其中一个。

我发现在调用 DLL 中的任何函数之前,我可以使用 windows 函数 LoadLibrary 加载两个库之一,并且 VB 将使用加载的库 - 但这只有在文件名与文件名匹配时才有效函数Declare(或Dllimport),即两个dll版本必须具有相同的文件名。这意味着这些dll不能位于同一目录中(例如在System32目录中)。

我能否拥有两个具有两个不同文件名的 dll,它们为运行时可选择的 VB.NET 提供相同的 API?

【问题讨论】:

    标签: vb.net dll


    【解决方案1】:

    除了compilation constants 之外,您无法真正进行条件导入。但是,您可以导入这两个 dll 并根据您的情况创建一个调用其中一个的方法。

    类似:

    <DllImport("firstversion.dll", EntryPoint:="GetDevice")> _
    Public Shared Function GetDevice_v1(ByVal arg1 As IntPtr, ByVal arg2 As String) As IntPtr
    End Function
    
    <DllImport("secondversion.dll", EntryPoint:="GetDevice")> _
    Public Shared Function GetDevice_v2(ByVal arg1 As IntPtr, ByVal arg2 As String) As IntPtr
    End Function
    
    Public Shared Function GetDevice(ByVal arg1 As IntPtr, ByVal arg2 As String) As IntPtr
        If condition Then
            Return GetDevice_v1(arg1, arg2)
        Else
            Return GetDevice_v2(arg1, arg2)
        End If
    End Function
    

    【讨论】:

    • 感谢您的建议。我试图避免使用类似的东西,因为其中一个 DLL 已经发布并正在使用中,这将需要替换它。我可能别无选择......
    • @FreddyBen-Zeev :恐怕没有别的办法,不。但是这样做有什么问题呢?为什么需要您替换其中一个 DLL? -- 使用这种方式的唯一要求是在 DLL 上有不同的名称将它们放在不同的文件夹中。
    • @FreddyBen-Zeev:你好!这对你来说怎么样,你有进步吗?如果我的回答解决了您的问题,请按我帖子左侧的勾号/复选标记将其标记为“已接受”。欲了解更多信息,请参阅:How does accepting an answer work?
    • @FreddyBen-Zeev :如果我的回答没有解决您的问题或者您遇到了某种并发症,请告诉我问题所在,我可能会提供帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2017-05-09
    • 2012-03-03
    • 1970-01-01
    • 2016-08-29
    相关资源
    最近更新 更多