0

我正在 P/Invoking 来自托管 VB.NET 的非托管 C++ 代码。

我的代码:

Imports System.Runtime.InteropServices

#Const MyLibPath = "mylib.dll"

Namespace MyLib
   Class A
      <DllImport(MyLibPath)> _
      Public Shared Sub foo()
      End Sub
   End Class
End Namespace

我得到错误:

未声明名称“MyLibPath”

filename参数DllImport应该是恒定的,那么为什么我不能使用#Const

另一种方法是编写一个字符串文字,或者将文件名存储在一个Private Const变量中,但是当我有多个DllImports 用于跨不同类的同一个 DLL 时,这会变得重复。我真的只想要一个常数。

4

2 回答 2

1

如评论中所述,VB.NET 编译器没有完整的 C 样式预处理器。您在代码或项目属性中定义的任何#Const 都只能在#If 表达式中使用。

改用 Const(没有 #)。

顺便说一句,避免将它们设为公开,这往往会在您发布错误修复时导致事故。它们的值直接编译到 IL 中,因此更改 Const 值不会自动更新在另一个程序集中使用的值,您没有重新编译或作为错误修复的一部分发布。不要超越朋友。

于 2013-06-20T21:50:35.493 回答
1

这是解决此问题的一种可能方法:将常量移动到公共类中:

Public Class Common
    Public Const MyLibPath As String = "mylib.dll"
End Class

然后引用该类的导入:

Class A
    <DllImport(Common.MyLibPath)> _
    Public Shared Sub foo()
    End Sub
End Class

或(假设公共类的命名空间是 WindowsApplication1):

Imports WindowsApplication1.Common

Class A
    <DllImport(MyLibPath)> _
    Public Shared Sub foo()
    End Sub
End Class
于 2013-06-02T19:38:55.233 回答