- - PR -
VisioのVBAからC#で作成したDLLを呼び出したい(プライベート配置で)。
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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-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-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-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