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

わんくま同盟

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

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

ツリー一括表示

COM+に登録したアセンブリについて /やや (18/04/10(Tue) 15:09) #87072
Re[1]: COM+に登録したアセンブリについて /Atata!! (18/04/11(Wed) 01:37) #87080
  └ Re[2]: COM+に登録したアセンブリについて /やや (18/04/11(Wed) 10:41) #87085
    └ Re[3]: COM+に登録したアセンブリについて /やや (18/04/11(Wed) 13:09) #87092
      └ Re[4]: COM+に登録したアセンブリについて /やや (18/04/12(Thu) 11:55) #87113 解決済み
        └ Re[5]: COM+に登録したアセンブリについて /Atata!! (18/04/14(Sat) 02:17) #87134 解決済み
          └ Re[6]: COM+に登録したアセンブリについて /やや (18/04/17(Tue) 13:48) #87156 解決済み


親記事 / ▼[ 87080 ]
■87072 / 親階層)  COM+に登録したアセンブリについて
□投稿者/ やや (1回)-(2018/04/10(Tue) 15:09:59)

分類:[.NET 全般] 

2018/04/10(Tue) 15:16:31 編集(投稿者)
2018/04/10(Tue) 15:16:27 編集(投稿者)

VisualStudio2015
VB.NET
.NetFramework4.7


お世話になっております。

プラットフォームをAnyCPUにしたDLLをCOM+アプリケーションとしてコンポーネントサービスに登録しました。
実行環境のOSは64bitで当該DLLが参照しているDLLはすべて、AnyCPUです。
動かしてみたところ、COM+に登録したアセンブリのクラスをインスタンス化する箇所で下記のメッセージが出力されます。

「クラスが登録されていません」

調べたところ、32bitと64bitのモジュールが混在している際に発生するエラーのようです。
そこで、COM+に登録するアセンブリのプラットフォームを32bit、64bitにしてテストしてみたところ、下記のようになりました。

32bit:正常動作。インスタンスも成功し、処理も実行できる。
64bit:COM+に登録したアセンブリを参照しているアセンブリのメソッドを呼ぶ箇所でエラー「間違ったフォーマットのプログラムを読み込もうとしました」

「間違ったフォーマットのプログラムを読み込もうとしました」というエラーについて調べたところ、
こちらも32bitと64bitのモジュールが混在している際に発生するエラーのようです。


そこで質問なのですが、COM+に登録するアセンブリは、プラットフォームを32ビットにしなければいけないのでしょうか?
仮にそうである場合、なぜそうなるのか教えて頂けないでしょうか?


宜しくお願い致します。

[ □ Tree ] 返信 編集キー/

▲[ 87072 ] / ▼[ 87085 ]
■87080 / 1階層)  Re[1]: COM+に登録したアセンブリについて
□投稿者/ Atata!! (1回)-(2018/04/11(Wed) 01:37:28)
> そこで質問なのですが、COM+に登録するアセンブリは、プラットフォームを32ビットにしなければいけないのでしょうか?

そんなことはありませんが、クライアントのビット数に合わせる必要があります。


> 仮にそうである場合、なぜそうなるのか教えて頂けないでしょうか?

以下のページと同じ手法で作成していると仮定しています。
https://msdn.microsoft.com/ja-jp/library/ms973809.aspx
違う場合は指摘してください。

まず、32 ビットで作成した場合、32 ビットのレジストリが構成されます。
この後、64 ビットにビット数を変更しても 32 ビットのレジストリが残っているため、
64 ビットでは再登録されず、32 ビットイメージを読み込もうとして BadImageFormatException になります。

64 ビットで登録するにはいったん 32 ビットをアンインストールした後、
再度 64 ビットで登録するようにしてみてください。それで問題なく動作するはずです。

なお、VS2015 では 32 ビット優先が有効になっているため AnyCPU では 32 ビットでインストールされるかと思います。

[ 親 87072 / □ Tree ] 返信 編集キー/

▲[ 87080 ] / ▼[ 87092 ]
■87085 / 2階層)  Re[2]: COM+に登録したアセンブリについて
□投稿者/ やや (3回)-(2018/04/11(Wed) 10:41:02)
Atataさん、ご返信まことにありがとうございます。
ネットや実験等で数十時間調査しているにも関わらず、解決していない現状ですので非常に助かります…


> そんなことはありませんが、クライアントのビット数に合わせる必要があります。

自分も同様の認識であったのですが、
今回はOSが64ビットであるにもかかわらず、COM+アプリケーションに登録するDLLが32ビットでしか動かず戸惑っている現状です。

> 以下のページと同じ手法で作成していると仮定しています。
> https://msdn.microsoft.com/ja-jp/library/ms973809.aspx
> 違う場合は指摘してください。

下記の点が異なります。

・アセンブリインフォにCOM+アプリケーション名は指定していません
・COM+アプリケーションへは動的に登録せず、コンポーネントサービスからGUI上で登録しています。

> まず、32 ビットで作成した場合、32 ビットのレジストリが構成されます。
> この後、64 ビットにビット数を変更しても 32 ビットのレジストリが残っているため、
> 64 ビットでは再登録されず、32 ビットイメージを読み込もうとして BadImageFormatException になります。

自作DLLをビルドして、COM+にGUI上から登録した場合も、レジストリ登録までされるものなのでしょうか?


> 64 ビットで登録するにはいったん 32 ビットをアンインストールした後、
> 再度 64 ビットで登録するようにしてみてください。それで問題なく動作するはずです。

ここで言っているアンインストールとは、下記の作業であっているでしょうか?
@COM+アプリケーションをコンポーネントサービスから削除
Aレジストリから当該アプリケーションを削除

いかがでしょうか?


No87080 (Atata!! さん) に返信
>>そこで質問なのですが、COM+に登録するアセンブリは、プラットフォームを32ビットにしなければいけないのでしょうか?
>
> そんなことはありませんが、クライアントのビット数に合わせる必要があります。
>
>
>>仮にそうである場合、なぜそうなるのか教えて頂けないでしょうか?
>
> 以下のページと同じ手法で作成していると仮定しています。
> https://msdn.microsoft.com/ja-jp/library/ms973809.aspx
> 違う場合は指摘してください。
>
> まず、32 ビットで作成した場合、32 ビットのレジストリが構成されます。
> この後、64 ビットにビット数を変更しても 32 ビットのレジストリが残っているため、
> 64 ビットでは再登録されず、32 ビットイメージを読み込もうとして BadImageFormatException になります。
>
> 64 ビットで登録するにはいったん 32 ビットをアンインストールした後、
> 再度 64 ビットで登録するようにしてみてください。それで問題なく動作するはずです。
>
> なお、VS2015 では 32 ビット優先が有効になっているため AnyCPU では 32 ビットでインストールされるかと思います。
>
[ 親 87072 / □ Tree ] 返信 編集キー/

▲[ 87085 ] / ▼[ 87113 ]
■87092 / 3階層)  Re[3]: COM+に登録したアセンブリについて
□投稿者/ やや (4回)-(2018/04/11(Wed) 13:09:01)
追記いたします。


コンポーネントサービスよりGUI操作でCOM+の登録を削除し、
レジストリ削除のコマンドを実行したところ、以下のメッセージが表示されました。

「DllUnregisterServerエントリポイントが見つかりませんでした」

おそらくDLLの情報はレジストリには登録されていないと思われるのですが、いかがでしょうか?

[ 親 87072 / □ Tree ] 返信 編集キー/

▲[ 87092 ] / ▼[ 87134 ]
■87113 / 4階層)  Re[4]: COM+に登録したアセンブリについて
□投稿者/ やや (5回)-(2018/04/12(Thu) 11:55:43)
2018/04/12(Thu) 11:56:14 編集(投稿者)

本件、自己解決をしたことをご報告致します。

【原因】
呼び出し元のテストドライバが「AnyCPU」で「32bitを優先する」にチェックが入っていたため。

OSが64ビットでもデフォルトで「32bitを優先する」にチェックが入るため、64ビットDLLを参照する場合はそのチェックを解除して動かさなければいけないようです。


ご回答いただいたAtataさん、ありがとうございました。
解決済み
[ 親 87072 / □ Tree ] 返信 編集キー/

▲[ 87113 ] / ▼[ 87156 ]
■87134 / 5階層)  Re[5]: COM+に登録したアセンブリについて
□投稿者/ Atata!! (2回)-(2018/04/14(Sat) 02:17:19)
2018/04/14(Sat) 02:17:56 編集(投稿者)

自己解決されたようで何よりです。
ものすごく遅くなりましたが、書き込まれた内容にフォローしておきます。


> 今回はOSが64ビットであるにもかかわらず、COM+アプリケーションに登録するDLLが32ビットでしか動かず戸惑っている現状です。

すでに解決されている通り、OS のビット数は影響しません。
私が述べたかったクライアントとは COM+ クライアントのことで、
COM+ アプリケーションを使う側のソフトウェアのビット数を示しています。
この辺で認識の齟齬があったのかと思います。


> 自作DLLをビルドして、COM+にGUI上から登録した場合も、レジストリ登録までされるものなのでしょうか?

はい。常に登録されます。COM+ は基盤技術として COM を使用しており、
かつ、SxS 配置できないため、レジストリ登録が必須となります。
これは CUI の REGSVCS ユーティリティを使用しても同様です。


> ここで言っているアンインストールとは、下記の作業であっているでしょうか?
> @COM+アプリケーションをコンポーネントサービスから削除
> Aレジストリから当該アプリケーションを削除

.NET で作った COM+ アプリケーションは@の手順でほとんど問題ありません。
Aが必要になるのはタイプライブラリを削除するか上の手順でアンインストールできなかった場合のみです。
REGSVCS の解説に記述があったと思いますが、内部で REGASM ユーティリティと同等のことを
実施しているとのことです。


> おそらくDLLの情報はレジストリには登録されていないと思われるのですが、いかがでしょうか?

おそらく直接 REGSVR32 にアセンブリを指定して起動したのだと思いますが、それは正常に動作しません。
.NET アセンブリをレジストリ登録するのは REGASM です。

解決済み
[ 親 87072 / □ Tree ] 返信 編集キー/

▲[ 87134 ] / 返信無し
■87156 / 6階層)  Re[6]: COM+に登録したアセンブリについて
□投稿者/ やや (6回)-(2018/04/17(Tue) 13:48:57)
2018/04/17(Tue) 13:53:46 編集(投稿者)
2018/04/17(Tue) 13:49:18 編集(投稿者)
フォロー回答いただき、ありがとうございます。

> おそらく直接 REGSVR32 にアセンブリを指定して起動したのだと思いますが、それは正常に動作しません。
> .NET アセンブリをレジストリ登録するのは REGASM です。

はい、REGSVR32 にアセンブリを指定して起動しました。
アセンブリをレジストリ登録する場合はREGASMを使うんですね。
勉強になりました。

ありがとうございました。



解決済み
[ 親 87072 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -