DllImportと、Declare どちらを使うべきなのか

huahi11115 340 評価のポイント
2024-03-18T03:05:14.28+00:00

VS2019, .Net Framework 4.7、 VB.net でプログラムを作成しています。

クラスのインスタンスを作成して、C++ネイティブの関数を呼び出したいと思っています。

一般に、VB.netでの定義はDllImportとDeclareの2通りがあるようですが、クラスをシングルトンにするという考えは無いので、下のサンプルのBeep()にsharedの修飾を付けたくありません。

ところが、① Public Shared Function Beep() の Shared を取り払うとコンパイルエラーが出ます。このエラーの意味も理解できません。

②ではSharedにしなくても正常にコンパイルできます。

質問ですが、

プログラムの実行速度を最優先で設計するならば、①と②のどちらがメリットがあるのですか。

①でSharedの修飾を外すとエラーが出る原因は何ですか。

よろしくお願い致します。

Class MainWindow

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded

  Dim cl1 As New testclass

  cl1.Beep(8000, 100)

  Debug.Print("終了")
   End Sub

End Class

Public Class testclass

   '① sharedを取り払うとコンパイルが通らない

   'System.Runtime.InteropServices.DllImportAttribute' はインスタンス メソッドに適用できません。

   <System.Runtime.InteropServices.DllImport("KERNEL32.DLL")>

   Public Shared Function Beep(

ByVal dwFlags As Integer,

ByVal dwDuration As Integer) As Integer


   '② これは正常に動作する

   'Public Declare Auto Function Beep Lib "kernel32.dll" (ByVal dwFlags As Integer,

   ' ByVal dwDuration As Integer) As Integer

End Class

.NET
.NET
.NET ソフトウェア フレームワークに基づく Microsoft テクノロジ。
66 件の質問
{count} 件の投票

2 件の回答

並べ替え方法: 最も役に立つ
  1. SurferOnWww 3,201 評価のポイント
    2024-03-18T03:23:32.6666667+00:00

    エラーメッセージでググると以下の記事がヒットしますが、見ましたか? ここに書いてある説明でわからないことは何でしょうか?

    'System.Runtime.InteropServices.DllImportAttribute' はインスタンス メソッドに適用できません

    ".NET Framework 外のアンマネージ プラットフォームは .NET Framework と同じようには非共有プロシージャをサポートしないため、非共有プロシージャを使用してそれらを相互運用することはできません。 Because unmanaged platforms outside the .NET Framework do not support nonshared procedures the same way the .NET Framework does, you cannot interoperate with them using nonshared procedures."


  2. SurferOnWww 3,201 評価のポイント
    2024-03-18T10:42:52.33+00:00

    回答をもらったらそれに対するフィードバックを返す、問題が解決したらクローズすることをお願いします。マナーとして

    0 件のコメント コメントはありません

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。