VBScriptでカスタム.NET DLLにアクセスする
-
19-08-2019 - |
質問
.NETでDLLを作成し、VBScriptでDLLにアクセスしたい。アセンブリディレクトリに追加したくありません。
DLLをポイントし、そのインスタンスを作成する方法はありますか?
解決
regasmユーティリティで.NET dllを登録できます。 /codebase
パラメーターを指定します。このパラメーターは、署名のないアセンブリで使用することは推奨されませんが、アセンブリをGACに配置できない場合に機能します。
regasm your.dll /codebase
.dllのパスはWindowsレジストリに挿入されるため、この操作の後に.dllのパスを変更しないでください。
他のヒント
私は自分でこれをしなければならなかった、私の発見は次のとおりでした:
COMに型を表示させる:
- クラスがパブリックで非静的であり、パブリックなデフォルトコンストラクター(引数ではない)を持っていることを確認します。
- メソッドがパブリックかつ非静的であることを確認してください。
-
アセンブリに次のセットがあることを確認します-通常AssemblyInfo.csにあります
[assembly: ComVisible(true)]
-
DLLをビルドした後、SDKコマンドラインから次を実行します。
regasm yourdll.dll
これは応答するはずです:
タイプが正常に登録されました
取得した場合
RegAsm:警告RA0000:型が登録されていません
その後、
ComVisible
を設定するか、パブリックで非静的な型を持たないようにする必要があります。
PowerShellから
$a = New-Object -comobject Your.Utils.Logging
$a.WriteError2("Application", "hello",1,1)
vbsから
Set logger = CreateObject("Your.Utils.Logging")
logger.WriteError2 "Application", "hello from vbs",1,1
huseyintの答えはお金に関するものでしたが、少し追加したかったのです。この問題に使用したいくつかのサンプルコードを次に示します。おそらく、作業をスピードアップできます...
// bind a variabe to WScript.Shell
Set WshShell = CreateObject("WScript.Shell")
// define the path to the regasm.exe file
RegAsmPath = "c:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe"
// register the dll
WshShell.run "cmd /c " & RegAsmPath & " c:\temp\cbsecurity.dll /codebase /nologo /s", 0, True
// bind a variable to the dll
Set cbUtil = CreateObject("CBSecurity.Utilities")
dllにIsAliveメソッドを含めました...
Public Function IsAlive() As Boolean
Return True
End Function
...そして、構文を使用して正しく登録されたことを確認できます:
//check if dll is available to your code
msgbox "cbUtil is alive: " & cbUtil.IsAlive
これが誰かの助けになることを願っています...
誰かがVBScriptからのみ呼び出される.Net dllをデバッグ/ステップインする必要がある場合:
-
.Net dllプロジェクトのデバッグセットアップ画面で、<!> quot; start external program <!> quot;を設定します。 wscript.exeプログラム(C:\ WINDOWS \ system32 \ wscript.exeにあります)を参照します。
-
<!> quot;コマンドライン引数<!> quot;で、VBScriptファイル(C:\ Test \ myTest.vbs)のファイル名とパスの場所を設定します。 vbsファイルとdllファイルが同じ場所にあることを確認してください。
-
最後に、.NetプロジェクトDLLのソースコードでブレークポイントを設定し、<!> quot; start debug <!> quot;
をクリックします。
直接ではありません。 COM(したがってVBScript)から呼び出すすべての.NETライブラリへのCOM Callable Wrapperが必要です。そのため、DLLにCCWを直接作成するか、.NET DLLを読み込む汎用メソッドを提供し、コンポーネントの実際のメソッドを呼び出して結果を返すメソッドを提供するプロキシDLLのCCWを作成する必要があります。まったくきれいではありません。したがって、一般的には、答えはノーです。