0

マネージ VB.NET からアンマネージ C++ コードを P/Invoking しています。

私のコード:

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変数に格納することですDllImportが、同じ DLL に対して多数の が異なるクラスに分散している場合、これは繰り返されます。私は本当に1つの定数が欲しいだけです。

4

2 に答える 2

1

この問題を解決する 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 に答える
1

コメントで述べたように、VB.NET コンパイラには完全な C スタイルのプリプロセッサがありません。コードまたはプロジェクト プロパティで定義する #Const は、#If 式でのみ使用できます。

代わりに Const を使用します (# なし)。

バグ修正を出荷するときに事故を引き起こす傾向があるので、それらをパブリックにすることは避けてください。それらの値は IL に直接コンパイルされるため、Const 値を変更しても、バグ修正の一部として再コンパイルまたは出荷しない別のアセンブリで使用される値は自動的に更新されません。友達を超えないでください。

于 2013-06-20T21:50:35.493 に答える