# 「メソッド」表現と# 「メッソド」表現が混在しているのが気になりますが、# それはとりあえず置いといて……。> DLL 側の引数が byref の object型になっていて、> 各メソッド内で、object.hoge = "" 等> DLL 側で値をセットしています。VB6製DLLにオブジェクトを渡す場合、そのデータ型は、COM としてレジストリに登録されている型である必要があります。指定したクラスが、COMとして公開されているかどうかを確認してみてください。> object hoge = new clsHoge();> vbdll.vbhoge( ref hoge );こんな感じでどうでしょう。---------- VB6製DLL (ProgID = "VB6SampleDLL.SampleClass") ----------Option ExplicitPublic 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 SubPrivate 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; }}
- Child Tree -