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

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

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

Re[3]: ワードの参照ライブラリーの互換性


(過去ログ 163 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■94290 / inTopicNo.1)  ワードの参照ライブラリーの互換性
  
□投稿者/ uko (1回)-(2020/03/31(Tue) 11:21:23)

分類:[.NET 全般] 

現象:Microsoft Word 14.0 Object Library参照しコンパイルしたアドインプログラムをWord2016で動かすとエラーとなる。
環境:PCシステムはWindows10(32bit)、開発ツールはVisual Basic 2008 Express Edition、ワードは2010。

詳細:
上記環境においてワードに関する参照は下記のようです:
Microsoft Word 14.0 Object Library COM 8.5.0.0 False C:\Windows\assembly\GAC_mSIL\Microsoft.Office.Interop.Word\14.1.1.1_71e9bce111e9429c\Microsoft.Office.Interop.Word.dll
ソースファイルをワード2016のインストールされているPCのVisual Basic 2008 Expressで開くと下記のようになります:
Microsoft Word 14.0 Object Library COM 8.5.0.0 False <システムでは、指定された参照は見つかりません。>
さらに、参照を削除して改めて参照追加すると下記のようになります:
Microsoft Word 16.0 Object Library COM 8.7.0.0 False C:\Windows\assembly\GAC_mSIL\Microsoft.Office.Interop.Word\15.1.1.1_71e9bce111e9429c\Microsoft.Office.Interop.Word.dll
当然この状態でコンパイルしたものはワード2016下で正常に作動します。

もし、ワード2010下でコンパイルしたものはそのままでワード2016で動かす方法をご存知の方がおれば是非お教え願いたいです。

追記:
ワードの定数を必要としているところには直接数値を入れ、あとオブジェクト関係は遅延バインディングということでAs Objectのように定義すれば良いのだろうが、イベントを発生させるところでは定義部にWithEventsを付す方法しか私は知りません。WithEventsを付けるとAs以下は例えばMicrosoft.Office.Interop.Word.Applicationとする必要があり、Microsoft Word Object Library を参照する必要があり、結果ワードのライブラリのバージョン違いの問題から抜け出せません。



引用返信 編集キー/
■94297 / inTopicNo.2)  Re[1]: ワードの参照ライブラリーの互換性
□投稿者/ KOZ (107回)-(2020/04/01(Wed) 10:03:40)
No94290 (uko さん) に返信
> もし、ワード2010下でコンパイルしたものはそのままでワード2016で動かす方法をご存知の方がおれば是非お教え願いたいです。

試したことはないのですが Microsoft.Office.Interop.Word.dll を同一フォルダに配布すると動かないでしょうか?

フォルダを以下の構成にします。

・プログラム名.exe
・プログラム名.exe.config
・プログラム名.exe.local (中身は空で良い)
・Microsoft.Office.Interop.Word.dll (2010 の DLL)

引用返信 編集キー/
■94312 / inTopicNo.3)  Re[2]: ワードの参照ライブラリーの互換性
□投稿者/ uko (2回)-(2020/04/01(Wed) 14:15:16)
No94297 (KOZ さん) に返信
> ■No94290 (uko さん) に返信
>>もし、ワード2010下でコンパイルしたものはそのままでワード2016で動かす方法をご存知の方がおれば是非お教え願いたいです。
>
> 試したことはないのですが Microsoft.Office.Interop.Word.dll を同一フォルダに配布すると動かないでしょうか?
>
> フォルダを以下の構成にします。
>
> ・プログラム名.exe
> ・プログラム名.exe.config
> ・プログラム名.exe.local (中身は空で良い)
> ・Microsoft.Office.Interop.Word.dll (2010 の DLL)
>



C:\Program Files (x86)\プログラム名>>
・プログラム名.exe
・プログラム名.exe.xml
・Microsoft.Office.Interop.Word.dll (2010 の DLL)
・Office.dll (2010 の DLL)


ワード2010側のC:\Windows\Assembly\GAC_MSILからMicrosoft.Office.Interop.Word.dllとOffice.dllを抜き出し、該フォルダーにコピーして動かしましたが、変化ありませんでした。

余談:
1)ワードのアドインとしてのプログラム名.dllであり、ワード2010の参照がワード2016では2016の参照を自動で読みに行ってもらえると良いと思います。かつては、自動でより新しいバージョンを参照してくれてたと思うが。
2)現在、同僚にはワード2016のあるPCでコンパイルしたものを配布している。
3)vbnetソースファイルでの記述状態は下記のようです:
定義部
Private WithEvents wApplication As Microsoft.Office.Interop.Word.Application
イベント部
Private Sub wApplication_WindowSelectionChange(ByVal Sel As Microsoft.Office.Interop.Word.Selection) Handles wApplication.WindowSelectionChange
...略
End Sub

ありがとう。
引用返信 編集キー/
■94346 / inTopicNo.4)  Re[3]: ワードの参照ライブラリーの互換性
□投稿者/ uko (3回)-(2020/04/05(Sun) 13:33:56)
No94312 (uko さん) に返信
> ■No94297 (KOZ さん) に返信
>>■No94290 (uko さん) に返信
> >>もし、ワード2010下でコンパイルしたものはそのままでワード2016で動かす方法をご存知の方がおれば是非お教え願いたいです。
>>
>>試したことはないのですが Microsoft.Office.Interop.Word.dll を同一フォルダに配布すると動かないでしょうか?
>>
>>フォルダを以下の構成にします。
>>
>>・プログラム名.exe
>>・プログラム名.exe.config
>>・プログラム名.exe.local (中身は空で良い)
>>・Microsoft.Office.Interop.Word.dll (2010 の DLL)
>>
>

マイクロソフトの下記サイトに、アセンブリ バージョンのリダイレクトというものがありました:
https://docs.microsoft.com/ja-jp/dotnet/framework/configure-apps/redirect-assembly-versions

その中の「構成ファイル内でのアセンブリ バインドの指定」という項目を参考にしました:
<dependentAssembly>
<assemblyIdentity name="myAssembly"
publicKeyToken="32ab4ba45e0a69a1"
culture="en-us" />
<!-- Assembly versions can be redirected in app,
publisher policy, or machine configuration files. -->
<bindingRedirect oldVersion="14.0.0.0" newVersion="15.0.0.0" />
</dependentAssembly>

該プログラム名.xml内に上記を追記したところ、古いバージョンの参照でコンパイルしたものでも
Microsoft.Office.Interop.Word.dllやOffice.dllが新しいバージョンのものを読みに行くことが
分かりました。インストールされているワードのバージョンに従い、自動で異なる参照にアクセスさせる
ことはできませんが、異なるプログラム名.xmlを用意し、ワードのバージョンに依って使い分ければ
良いと思われます。



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -