.NETでDLLを作成し、VBScriptでアクセスしたいと思います。アセンブリディレクトリに追加したくありません。
DLLもポイントして、そのインスタンスを作成する方法はありますか?
.NETでDLLを作成し、VBScriptでアクセスしたいと思います。アセンブリディレクトリに追加したくありません。
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
これが誰かに役立つことを願っています...
パラメータを指定することで、その .NET dll をregasm ユーティリティ/codebase
に登録できます。このパラメーターは、署名されていないアセンブリで使用することはお勧めしませんが、アセンブリを GAC に配置できない場合に機能します。
regasm your.dll /codebase
このパスは Windows レジストリに挿入されるため、この操作の後は .dll のパスを変更しないでください。
誰かが VBScript からのみ呼び出される .Net dll をデバッグ/ステップインする必要がある場合:
.Net dll プロジェクトのデバッグ セットアップ画面で、wscript.exe プログラム (C:\WINDOWS\system32\wscript.exe にあります) を参照して、「外部プログラムの開始」を設定します。
[コマンド ライン引数] で、VBScript ファイル (C:\Test\myTest.vbs) のファイル名とパスの場所を設定します。vbs ファイルと dll ファイルが同じ場所にあることを確認します。
最後に、.Net プロジェクトの DLL ソース コードでブレーク ポイントを設定し、[デバッグ開始] をクリックします。
直接ではありません。COM (したがって VBScript) から呼び出す .NET ライブラリには、COM Callable Wrapper が必要です。したがって、DLL への CCW を直接作成するか、.NET DLL をロードする汎用メソッドを提供するプロキシ DLL の CCW を作成し、コンポーネントで実際のメソッドを呼び出して結果を返すメソッドを提供する必要があります。それは本当にまったくきれいではありません。したがって、一般的に、答えはノーです。