|
分類:[C#]
# 「メソッド」表現と # 「メッソド」表現が混在しているのが気になりますが、 # それはとりあえず置いといて……。
> DLL 側の引数が byref の object型になっていて、 > 各メソッド内で、object.hoge = "" 等 > DLL 側で値をセットしています。 VB6製DLLにオブジェクトを渡す場合、そのデータ型は、COM として レジストリに登録されている型である必要があります。指定したクラスが、 COMとして公開されているかどうかを確認してみてください。
> object hoge = new clsHoge(); > vbdll.vbhoge( ref hoge );
こんな感じでどうでしょう。
---------- VB6製DLL (ProgID = "VB6SampleDLL.SampleClass") ---------- Option Explicit Public Sub vbhoge(ByRef object As Object) object.hoge = Format(Now, "yyyy-mm-dd hh:nn:ss") End Sub
'以下は、Marshal.ReleaseComObject の解放が行われたかのチェック用 Private Sub Class_Initialize() Debug.Print "-->"; ObjPtr(Me) End Sub Private Sub Class_Terminate() Debug.Print "<--"; ObjPtr(Me) End Sub
---------- C#2.0製コンソールアプリ ---------- using System; using System.Runtime.InteropServices;
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { VB6SampleDLL.SampleClass vbdll = null; try { object clsHoge = new Hoge(); vbdll = new VB6SampleDLL.SampleClassClass(); vbdll.vbhoge(ref clsHoge); Console.WriteLine(((Hoge)clsHoge).hoge); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if ((vbdll != null) && Marshal.IsComObject(vbdll)) { Marshal.ReleaseComObject(vbdll); } } Console.ReadLine(); } }
[ComVisible(true)] //[Guid("{1F4F835B-1702-4df9-8AF8-A782713FD1EC}")] //[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] public class Hoge { public string hoge = String.Empty; } }
|