- PR -

VisioのVBAからC#で作成したDLLを呼び出したい(プライベート配置で)。

1
投稿者投稿内容
ゆーほ
会議室デビュー日: 2004/01/19
投稿数: 8
投稿日時: 2004-01-19 22:03
初投稿です。皆様宜しくお願い致します。

Insider.NETの過去ログ『C#で作成したライブラリをVB6.0から使用』
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=1622&forum=7
を参考にした事で、C#で作成したDLLをグローバル配置し、VisioのVBAから
呼び出す事には成功しました。

しかし、プライベート配置による呼び出しで躓いてしまいました。

プライベート配置を行うに当たり、私が行った手順を以下に示します。

【1】C#でDLLを作成。(名前をTest.dllとする)
【2】レジストリに登録する。(regasm Test.dll)
【3】DLLからタイプライブラリを作成する。(tlbexp Test.dll)
【4】作成したタイプライブラリをVBAの「参照設定」から追加する。


VBAではDeclareでDLLを定義し呼び出したのですが
「Testが見つかりません」といったエラーが出てメソッドが呼び出せませんでした。

以下がソースコードです。

----------------------------------------------------------------------
【C#ソースコード】
using System;

namespace Test{
public class TestClass{
public string testMessage(string message){
return message;
}
}
}
----------------------------------------------------------------------
【VisioのVBAソースコード】

Declare function testMessage Lib "Test.dll" (ByVal buf As String) As String

sub method

Dim obj
Set obj = CreateObject("Test.TestClass")
Dim str As String
Set str = obj.testMessage("test")
msgbox str,MB_OK,"TestMessage"
obj = Nothing

end sub
----------------------------------------------------------------------

VBAを実行すると、CreateObjectで止まってしまいます。

手順が間違っているのでしょうか。
それともやはり構成ファイル(.config)が必要なのでしょうか。
その場合、どのように作成するのでしょうか。
(何か生成するコマンドが存在するのでしょうか)


どなたかご教示頂けますと幸いです。
宜しくお願い致します。
ゆーほ
会議室デビュー日: 2004/01/19
投稿数: 8
投稿日時: 2004-01-20 15:45
VisioのVBAからC#のDLLを呼び出す前に、
まずはExcelのVBAからC#のDLLが呼び出せるのかを実験をしてみました。

VisioのVBAよりも
ExcelのVBAからC#のDLLを使ってみた方が
ここを見て下さる人にとっても実験しやすい気がしましたので・・・

前回の投稿でバージョンを書き忘れたので以下に記します。

VS.NET---2003
Excel---2002 SP-1
Excel VBA---Microsoft Visual Basic 6.0 VBA:Retail 6.48869
Visio---Enterprise Architects
Visio VBA---Microsoft Visual Basic 6.0 VBA:Retail 6.48869

C#とVBAのソースコードはそのままです。

まずは前回と同様の手順で実行してみたところ、
「ファイルまたはアセンブリ名Test、またはその依存関係の1つが
見つかりませんでした。」と実行時エラーが出てしまいました。
カーソルはCreateObjectで止まってしまいます。

そこで、構成ファイルを作成し、Excelファイルが置いてあるフォルダに
入れて見ました。

----------------------------------------------------------------------
<configuration>
<runtime>
<assemblyBinding xmlns = "urn:schemas-microsoft-com:asm.v1">
<probing privatePath="./Test.dll"/>
</assemblyBinding>
</runtime>
</configuration>
----------------------------------------------------------------------

Excelファイルの名前がvbaTest.xlsでしたので
vbaTest.xls.config というファイル名で上記を保存しました。

しかし、結果は変わりませんでした。

何か的外れな事をしているのでしょうか・・・
それともVBAからC#で作成したDLLをプライベート配置で使う事は
無理なのでしょうか・・・
ゆーほ
会議室デビュー日: 2004/01/19
投稿数: 8
投稿日時: 2004-01-23 19:42
構成ファイルのロケーション(一体、どこの何ていうディレクトリに置けばいいのやら!)
で新たに悩んでおります。

VisioのVBAから、C#.NETで作成したDLLをプライベート配置で呼び出すのは
一応成功しました。(一応、と付いている理由は後述します・・・)

手順としましては
1:VS.NET でdllを作成する
2:dllをregasm.exe でレジストリに登録し、COMとして使えるようにする
3:dllからtlbexp.exe でタイプライブラリを作成。VBAの「参照設定」でチェックする
4:dllをVisioのインストールフォルダに入れる

以上でC#.NETで作成したDLLをVisioのVBAから使う事には成功しました。
(ちなみにExcelのVBAから使うには、手順4でExcelのインストールフォルダに
変えると上手く行きます)

しかし、『インサイド .NET Framework 「第3回 アセンブリのロード」』
http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_03/idnfw11_03_05.html
では、このようなインストールディレクトリにドカンとDLLを入れる方法(プローブ)は
好ましくないという旨の記述があるではないですか!

最初に「一応」成功したと書いたのは、プローブに頼る事で
プライベート配置によるDLL呼び出しに成功したから、でした。

私自身も、どうせなら自分の好きな位置にDLLを置きたいと思っています。

CLR(共通言語ランタイム)はGACとコードベースしか見ないと言うことで、
構成ファイル(.config)内にコードベースを書けば好きな位置を指定できる
という所までは分かりました。

しかし、
1:構成ファイルにどのようなファイル名を付けてやるべきか
2:構成ファイルはどこに置くべきか
3:どのように書くべきか

が、どうにも良く分かりません・・・
ゆーほ
会議室デビュー日: 2004/01/19
投稿数: 8
投稿日時: 2004-01-23 19:59
長くなりそうなので、2つに分けて投稿させていただきました。
申し訳ございません。

1:につきましては・・・
実行ファイルの名前.config と言うことで
自分で作ったVisioのファイルの名前を使ってみました。(○△×.vsd.config)

2:につきましては・・・
Visioファイルの置いてあるフォルダに入れて見ました。

3:につきましては・・・
以下のように書いてみました。

<?xml version=!2.0" ?>
<configuration>
<runtime>
<asm:assemblyBinding xmlns:asm="urn:schemas-microsoft-com:asm.v1">
<asm:dependentAssembly>
<asm:codeBase href="./test/hogehoge.dll"/>
</asm:dependentAssembly>
</asm:assemblyBinding>
</runtime>
</configuration>

これで、○△×.vsdがあるフォルダのtestフォルダにあるhogehoge.dllを
参照してくれるかなぁ・・・と思いました。

でもCLRはこの構成ファイルを見てくれていないようなのです。

構成ファイル名をhogehoge.dll変えてみたり
Visio.exe.dllに変えてVisioのインストールディレクトリに入れて見たり。
(でもそれって結局、dll入れるのと何も手間が変わらなかったりして。)

色々試してみたのですが、全然上手くいきません(泣

どなたか知恵を貸していただけませんでしょうか。
自分でももっと調べてみようと思います。
(VBAから.NETのDLLを扱う方法って、中々まとまった資料が無いですね^^;
下記の『.NETコンポーネントをVB6から利用する方法』はとても分かりやすかったの
ですが、やはりプローブを利用した方法でした・・・)
http://www.sev.or.jp/ijupiter/world/
1

スキルアップ/キャリアアップ(JOB@IT)