C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 6 を表示中)
■6603 / )  Re[1]: C# から VB6.0のDLLのメッソドを起動
□投稿者/ 魔界の仮面弁士 中尉(142回)-(2006/09/19(Tue) 23:59:50)

分類:[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;
}
}


0
返信 編集キー/


管理者用

- Child Tree -