さて皆さん、
このゴールデンウイークは木工に熱中していたワテであるが、読者の方からVSTOに関して質問を頂いたので調査してみた。
その質問は、WordのVSTOアドインを作成中のfuzzyさんと言う方からで、その質問の詳細は以下のリンクにある。
質問を要約すると、WordのVSTOアドインを作成して他のPCに配布したのだが、何故か拡張子 .xmlのファイルが配置出来ない。つまりインストールされないと言う事なのだ。
ワテも初耳の症状である。
早速調査してみた。
ちなみに、ゴールデンウイークでワテが作った三台の棚の製作記事はこちら。
特徴としては、材料費3000円弱、工具は殆ど必要無くて木工用ボンドで貼れば完成する丈夫な棚だ。同じ構造で、縦長の本棚の製作も予定している。
では、本題に戻って表題のVSTOアドイン配布において何故か拡張子 .xmlファイルが配置出来ない問題とその解決方法に付いて説明したい。
WordのVSTOアドインを作成して他のPCに配布する
fuzzyさんの開発環境はVS2013 (Community)で、開発言語はVB.NETとの事だ。
ワテの場合はVS2017 (Community)を使っているので、その環境でVB.NETを使ってWord2013用のVSTOアドインを作成してみた。
Word2013と2016 VSTOアドインを作成
VS2017の新しいプロジェクトメニューを開いて、
Word2013と2016 VSTOアドイン
を選ぶ。
図 VS2017でWord2013用のVSTOアドインを作成する
上図において、
名前:fuzzyWordAddInVB1
とした。
リボンを追加する
その設定で新規VSTOプロジェクトのテンプレートが読み込まれた(下図)。
図 Word2013用VSTOプロジェクトにリボンを追加した
上図は、そのプロジェクトにリボンを追加した状態である。
ソリューションエクスプローラーには
Ribbon1.vb
が追加される。
ボタンクリックでアドインを配置したフォルダを開く
以下のVB.NETコードは、fuzzyさんに教えて頂いたコードだ。
リボンに追加したButton1をクリックするとアドインを配置したフォルダをファイルエクスプローラーで開く。
Imports System.IO Imports Microsoft.Office.Tools.Ribbon Public Class Ribbon1 Private Sub Ribbon1_Load(ByVal sender As System.Object, ByVal e As RibbonUIEventArgs) Handles MyBase.Load End Sub Private Sub Button1_Click(sender As Object, e As RibbonControlEventArgs) Handles Button1.Click Dim strBasePath As String = System.AppDomain.CurrentDomain.BaseDirectory System.Diagnostics.Process.Start(strBasePath) End Sub End Class
コード Button1クリックでアドイン配置先のフォルダーを開く
このコードでは、まず、文字列型 strBasePath 変数にアドインが配置されたフォルダの絶対パスを取得するようだ。
そして、そのパス名 strBasePath をProcess.Start()すると、Windows10のファイルエクスプローラーが別プロセスで起動してそのフォルダが開かれる。
では、実際にやってみよう。
test.txt、text.xml、text.xxxを追加して発行する
fuzzyさんの報告にある手順と全く同じ操作をしてみる。
まず、以下の三つのファイルをプロジェクトに追加した。
- test.txt
- text.xml
- text.xxx
その中身は何でも良いので実験用にxmlデータを書き込みたいので、以下のキーワードでGoogle検索した。
xmlファイル UTF-8 サンプル
それでヒットした総務省のサイトにあるPDFファイル、
www.soumu.go.jp/main_content/000478429.pdf
の最初に出て来る「学齢簿ファイル」
<?xml version="1.0" encoding="utf-8"?> <_05_就学_1_学齢簿ファイル> <識別番号>000000000000001</識別番号> ・・・ ・・・ ・・・ </_05_就学_1_学齢簿ファイル>
と言うのを書いておいた。
ファイル保存時のエンコードは、三つのファイル共に
Unicode(UTF-8 シグネチャ付き) - コードページ 65001
にしておいた。
理由は xmlのencodingがutf-8になっているので単にそれに合わせただけだ。深い意味はない。
ファイルのプロパティはデフォルトのまま
追加したファイルのプロパティはデフォルト設定のままにしておいた。
つまり、以下のようになっている。
- ビルドアクション: コンテンツ
- 出力ディレクトリにコピー: コピーしない
VSTOプロジェクトを発行する
プロジェクトを右クリックして「発行」を実行する。
全部デフォルトで[OK]をクリックすると、「公開」フォルダの中に
- setup.exe ファイル
- fuzzyWordAddInVB1.vsto ファイル
- Application Files フォルダ
が保管される。
VMware上のテストWindows10環境にVSTOをインストールする
VMwareに構築しているWindows10Pro (64)のテスト環境に、上で作成された「公開」フォルダをコピペした。
そしてsetup.exeを実行すると無事にWord2013用のVSTOアドインがインストール出来た。
早速、Wordを起動する。
無事にアドインが読み込まれているとリボンに[Button1]が追加されているはずだ。
それをクリックするとWindowsのエクスプローラーが起動した(下図)。
図 VMware上のWindows10テスト環境でWordのVSTOアドインを実行した例
う~ん、確かに test.txt はあるが text.xml が見つからない。
fuzzyさんの報告の通りだ。
.xmlファイルが配置されない問題を調査する
さて、ワテの経験で言うと、Visual Studioを使って何らかの開発をしていて原因不明の問題に直面したとしても、解決方法は必ずあると思っても良い。
なぜなら、Visual Studioは大勢の人が使っているし、今の時代、ネット上には情報が溢れている。エラーメッセージなどで検索すれば必ずヒットするだろう。
その問題が今まで誰も気づかずに世界で初めて自分が直面した問題などと言うケースは滅多に無い。
なので、プログラム開発における原因不明の問題の解決能力とは、ネット検索能力と同じと考えて良いだろう。
要するにネット検索したら必ず解決方法は見付かる。
スッポンのように喰らい付くくらいの気持ちで、解決の糸口が見つかるまでひたすら検索すれば良い。
ちなみにワテの場合、問題が解決するまで何時間でも検索する。
時間がある限り一週間くらいぶっ続けで検索しまくった事もある。
その結果、検索を実行した瞬間に、
「I’m not a robot」(わたしはロボットではありません)
reCAPTCHA
みたいなのが表示された事もある。
人間で有る事を証明する為に、判読し辛い文字をキーボード入力したり、この画像の中の道路標識をクリックして下さいというやつだ。
Google検索を連続で何時間もやっているとロボットと見なされるようだ。
そんなスッポンのワテであるが、早速検索してみた。
検索して他の人が公開している情報を参考にさせて貰う訳だから、こんなに楽ちんな事は無い。インターネットは便利だ。
ただし、いくら検索してもヒットしない場合もある。その場合は、
- 最近発覚した非常に珍しい問題で殆ど知られていない
- 物凄く初歩的な凡ミスなので自分の環境でしか起こっていない
のどちらかだ。
ワテの場合、後者のケースも時々ある。
ワテが世界で初めて発見したVisual Studioのバグなのか!と有頂天になった直後に、凡ミスを発見。数時間の試行錯誤が無駄だった。。。
あかんがな。
情報収集の為にGoogle検索する
早速Google検索だ。
Yahoo検索派の人も居るかもしれないが、ワテの場合はGoogle検索派だ。
How do I programmatically find the deployed files for a VSTO Add-In …
https://robindotnet.wordpress.com/…/how-do-i-programmatically-fi…2010/07/11 – It is very similar to deploying a desktop application, but not identical. With all types of ClickOnce deployments, you may include resources that you need to access programmatically. Files with a file extension of .xml, .mdf, and …
引用元 https://robindotnet.wordpress.com/2010/07/11/how-do-i-programmatically-find-the-deployed-files-for-a-vsto-add-in/
なんや知らんがそれらしいキーワードがあるので何となく関係あるのかな。
早速このページを開いてみる。
一部を引用すると以下の通り。
下線部分が何か関係している感じ。
How do I programmatically find the deployed files for a VSTO Add-In?
You can use ClickOnce deployment to install Office Add-ins for Office 2007 and Office 2010. It is very similar to deploying a desktop application, but not identical. With all types of ClickOnce deployments, you may include resources that you need to access programmatically.
Files with a file extension of .xml, .mdf, and .mdb are assumed to be data and are deployed by default to the ApplicationDeployment.CurrentDeployment.DataDirectory, but non-data files will be found in the folder with the deployed assemblies.
省略
Here’s the code in VB:
'Get the assembly information Dim assemblyInfo As System.Reflection.Assembly = System.Reflection.Assembly.GetExecutingAssembly() 'Location is where the assembly is run from Dim assemblyLocation As String = assemblyInfo.Location 'CodeBase is the location of the ClickOnce deployment files Dim uriCodeBase As Uri = New Uri(assemblyInfo.CodeBase) Dim ClickOnceLocation As String = Path.GetDirectoryName(uriCodeBase.LocalPath.ToString())省略
つまりまあ、英語の下手なワテの解釈では、この下線部分の意味は、
拡張子 .xml, .mdf, .mdb のファイルはデータと見なされて、その配布先フォルダは
ApplicationDeployment.CurrentDeployment.DataDirectory ①
となる。
一方、非データファイルはdeployed assembliesフォルダに配置される。
と言う事だ。つまり、VSTOアドイン本体が保管されるフォルダだ。
なので、VSTOをインストールするとファイルは二カ所に分かれて保管されるらしい。
知らなんだ。
で、それらを調べるには上に引用したVB.NETのコードが役に立つのかなと思ったが、そうでは無かった。
このVB.NETコードの中には①のフォルダを取得する記述が無い。
それで、再び適当にGoogle検索して、①のフォルダ情報を取得するVB.NETコードを作成してみた。
Private Sub Button2_Click(sender As Object, e As RibbonControlEventArgs) Handles Button2.Click Try ' Imports System.Deployment.Application が必要 Dim DataDirectory As String = System.Deployment.Application.ApplicationDeployment.CurrentDeployment.DataDirectory System.Diagnostics.Process.Start(DataDirectory) Catch ex As Exception MsgBox( Prompt:="exの中身:" & ex.ToString(), Buttons:=MsgBoxStyle.OkOnly Or MsgBoxStyle.Exclamation, Title:="なんやエラーしたぞ" ) End Try End Sub
コード Button2クリックで拡張子 .xml, .mdf, .mdb などのデータファイルの保管フォルダを開く
このコードでは、リボンに追加した[Button2]のクリックで、拡張子 .xml, .mdf, .mdb などのデータファイルの保管フォルダ①を開く。
なお、上のコードをビルドするためには、以下の参照設定が必要だ。
図 System.Deploymentを参照に追加する
上図のようにSystem.Deploymentを参照に追加しておく。
その後、VB.NETコードの先頭で、以下のImportsを追加する。
Imports System.Deployment.Application ' Syetem.Deploymentに参照設定が必要
これはC#のusingに相当するコマンドだ。
再びテスト環境VMwareでWordのVSTOをインストールする
発行を実行すると「公開」フォルダの中のApplication Filesフォルダに新しいバージョンが追加される。
Application Filesフォルダを確認すると二つのサブフォルダが見つかった。
fuzzyWordAddInVB1_1_0_0_0 最初のやつ
fuzzyWordAddInVB1_1_0_0_1 今回作成されたやつ
この1番目のやつは不要なので手で削除した(それで良いのかどうか知らない)。
この後、「公開」フォルダをコピペしてVMwareのテストWindows10環境に持って行く。
そしてsetup.exeを実行すると、無事に新しいバージョンfuzzyWordAddInVB1_1_0_0_1がインストールされた。
早速実行してみる。
テスト環境でApplicationDeployment.CurrentDeployment.DataDirectory を表示する
VMwareのWindows10テスト環境でWord2013を起動して、リボンに表示される[Button2]をクリックしてみた。
その結果、test.xml ファイルが有った!
このフォルダはVSTOのデータを保管するフォルダのようだ。
一方、VSTOの本体が保管されているのはfuzzyさんがやっているようにButton1で表示されるフォルダらしい。
Try – Catchの理由
なお、上記のVB.NETコードではButton2クリックのイベントハンドラ関数内でTry -Catch で例外をキャッチしている。
その理由は、フォルダ①は発行先のパソコン(VMwareのWindows10)には存在するのだが、開発マシンではまだsetup.exeを実行していないのでフォルダ①を参照すると例外が出るようだ。
詳しくは調べていない。
その他の参考サイト
今回の記事を作成する上で、以下のサイトも参考にした。
ClickOnceデータ・ディレクトリのパスを取得するには?[2.0のみ、C#、VB]デジタルアドバンテージ 一色 政彦
ClickOnceデータ・ディレクトリのパスを取得するには?[2.0のみ、C#、VB] - @IT
- ClickOnceデータ・ディレクトリのパスの取得方法
- 別の方法によるClickOnceデータ・ディレクトリのパスの取得
まとめ
fuzzyさんからお寄せ頂いたWordのVSTOを配置した場合に、何故か拡張子 .xmlのファイルがインストールされないと言う問題を調査した。
結論としては、.xmlファイルも正しくインストールされている。
見付からなかった理由は、VSTO本体とは別のフォルダに保管されていたから。
その場所は、以下のフォルダの下なので、
C:\Users\wate\AppData
例えばファイル名
test.xml
を指定してこのフォルダを検索すると、そのxmlファイルは見付かるはずだ。
実は、ワテは最初にそれを実行して、test.xmlファイルが正しくインストールされている事実を確認出来た。
その後、上で説明した手順でそのフォルダ①を表示したのだ。
ワテの場合、ExcelのVSTO、XLL、VBAアドインは良く作るが、WordのVSTOアドインはあまり作った経験が無い。
今回fuzzyさんからお寄せ頂いた問題を調査した事によって、ワテも久しぶりにプログラミング作業をする事が出来た。
Visual Studioはとても安定しているので皆さんにもお勧めしたい。
と言う事で、この記事によってfuzzyさんの問題が解決すれば良いのだが。
コメント
wareko様、こんにちは!
本件では、ご尽力を頂き、深く感謝申し上げます。
以下のコメントの通り、解決致しました。
https://www.wareko.jp/blog/publish-excel-vsto-add-in-to-another-pc-3of10#comment-6607
心より御礼申し上げます。m(__)m
今後ともどうぞよろしくお願い申し上げます。