2013-06-02 28 views
0

我是P /從託管VB.NET調用非託管C++代碼。我可以不提供文件名作爲編譯時常量的DllImport嗎?

我的代碼:

Imports System.Runtime.InteropServices 

#Const MyLibPath = "mylib.dll" 

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

我得到的錯誤:

Name 'MyLibPath' not declared

filename參數DllImport應該是恆定的,所以我爲什麼不能用#Const

另一種方法是編寫一個字符串字面值,或將該文件名存儲在Private Const變量中,但對於跨不同類的相同DLL分佈的DllImport個數,這會變得重複。我真的只想要一個恆定的。

+1

你在混合Const和#Const。 VB.NET沒有預處理器來替代像C這樣的標識符。 #Const僅在#If表達式中可用。改用Const。 –

回答

1

正如註釋中所述,VB.NET編譯器沒有完整的C風格預處理器。您在代碼或項目屬性中定義的#Const只能在#If表達式中使用。

改爲使用Const(否#)。

避免讓它們公開btw公共btw,當您發佈錯誤修復時,這往往會導致事故。它們的值直接編譯爲IL,因此更改Const值並不會自動更新另一個程序集中使用的值,該值不會作爲錯誤修復的一部分重新編譯或發佈。不要超越朋友。

+0

哦,它不會預處理爲任意語句?那麼,我的答案呢。 D'哦!謝謝。 –

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 
相關問題