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

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

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

Re[3]: VB6で作成していたDCOM用EXEをVB.NETでも利用


(過去ログ 124 を表示中)

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

■73843 / inTopicNo.1)  VB6で作成していたDCOM用EXEをVB.NETでも利用
  
□投稿者/ いけ (1回)-(2014/11/09(Sun) 14:49:48)

分類:[VB.NET/VB2005 以降] 

こんにちは。初めての質問になります。よろしくお願いします。

<環境>
新開発環境:VisualStudio 2010 VB.NET 4.0
旧開発環境:VisualBasic6
新OS:クライアント Windows7 32bit サーバー:Windows Server 2008 R2 64bit
旧OS:クライアント Windows XP 32bit サーバー:Windows Server 2003 32bit?

現在VB6のシステムをVB.NETに移行する案件を作業しています。
システムの中に以下の様なものがあります。

プログラムA(クライアントで実行するEXE)
「Dim objB as Object = CreateObject( "B.Class", "サーバーIP" )」とBのクラスインスタンスを作成している。

プログラムB(サーバーでCOM登録するEXE)
「B.Class」というクラスを定義している。
実行ファイルをサーバーに配置して「B.EXE /REGSERVER」で登録する(旧環境導入手順ドキュメントより)

IP指定する処理は今まで知らなかった手法なので調べるとDCOMというものと分かり
ひとまずB.EXEをVB.NETで作成し、COM登録として「B.EXE /REGSERVER」を実行したのですが
何もエラーは出ていないのですが「dcomcnfg」でDCOM一覧を見ても何も追加されておりませんでした。

エラーもないので手探りで色々と不明瞭な点を調べている状態なのですが
どういう方向で調べればいいのか分からないためご知恵をお貸し頂きたいです。
聞きたい内容を以下に列挙します。十分な調査ができているとは言えないので、質問自体がおかしい場合はご指摘いただければと思います。

1.VB.NETで作成したEXEを「B.EXE /REGSERVER」で登録するという事自体間違いなのでしょうか?
  調査中「RCW(Runtime Callable Wrapper)」というラッパーを用いるという記事を見たのですが
  COM登録した後呼び出しに用いるという認識で、そもそもCOM登録するのかしないのかがよく分かりませんでした。

2.「B.EXE /REGSERVER」を実行したものはコンポーネントサービスの「DCOMの構成」一覧に表示されると思っているのですが、それが誤りなのでしょうか?

3.2が認識あっている場合、登録失敗したならエラー内容を知りたいのですが
  現状ではエンターキーを押すと何もメッセージが出ません。何か表示する方法があるのでしょうか?

<補足>
・CreateObjectの第二引数を空にしてA.EXEとB.EXEを同一の場所に出力してA.EXEを実行するとB.Classインスタンスは正常に作成出来ます。
 定義した関数の中の処理も正常に動作します。

・出力しているプロセスは全て32bitで出力しています。

・コマンドプロンプトを実行する際は「管理者権限で実行」から起動しています。

・Bで実行しているのはDBアクセス、画像処理程度なのですが画像処理周りのがボリュームが大きいため、出来ればC++などに置き換えないで済むのが理想です。

・BをDCOM登録しているのはクライアントへの負荷を減らすためだと思うのですがリプレイス後も同様の構造にしたいようです。

ご不明な点等ありましたら、ご指摘お願いします。以上です。

引用返信 編集キー/
■73855 / inTopicNo.2)  Re[1]: VB6で作成していたDCOM用EXEをVB.NETでも利用
□投稿者/ とっちゃん (273回)-(2014/11/10(Mon) 14:05:42)
とっちゃん さんの Web サイト
No73843 (いけ さん) に返信
> プログラムB(サーバーでCOM登録するEXE)
> 「B.Class」というクラスを定義している。
> 実行ファイルをサーバーに配置して「B.EXE /REGSERVER」で登録する(旧環境導入手順ドキュメントより)
>
> IP指定する処理は今まで知らなかった手法なので調べるとDCOMというものと分かり
> ひとまずB.EXEをVB.NETで作成し、COM登録として「B.EXE /REGSERVER」を実行したのですが
> 何もエラーは出ていないのですが「dcomcnfg」でDCOM一覧を見ても何も追加されておりませんでした。
>
B.EXE に、/REGSERVER というコマンドライン引数を処理するコードは追加していますか?

VB6と、.NET Framework 時代のVBとは、いろいろな部分が違います。
この「/REGSERVER」というコマンドライン引数もその一つです。

もし、処理するコードを追加していて、それでもDCOMとして登録されていないようだということであれば
DCOM登録処理をどうやっているかを開示すると、回答が得られるかもしれません。


ちなみに。。。上記のように書いているからわかると思いますが、.NET はDCOMを直接的にサポートしてません。
もっとも、.NET の COMサポートも、どちらかといえば互換性のためのレガシーサポートという形で見たほうがすっきりする構造ですが。


クライアント側もサーバー側も全面再構築とするのなら、古くて面倒なDCOMを使うより、.NET がサポートするマシン間接続の方法を
用いて、接続部分も作り変えることをお勧めします。

DCOMを直接的にリプレイスという形に近いのは、.NET Remoting とその発展形(今はWCFに統合)となりますし、
より、パブリックな世界(サーバーはいずれクラウドへなど)とつなげるようにというのなら、Webサービスのようなhttp接続での
ステートレスアクセスになるでしょう。

どういう形がいいのか?については、DBアクセスや画像処理というだけでは何とも言えません。

最近の環境(VB6が出た当初のLANにおけるようなサーバーマシンだったら今どきのノートのほうがよっぽど高性能)だったら
下手にサーバーで画像処理するより、クライアントで処理したほうが高速ということもあるかもしれません。

引用返信 編集キー/
■73867 / inTopicNo.3)  Re[2]: VB6で作成していたDCOM用EXEをVB.NETでも利用
□投稿者/ いけ (2回)-(2014/11/10(Mon) 20:39:53)
とっちゃん様回答ありがとうございます。

No73855 (とっちゃん さん) に返信
> ■No73843 (いけ さん) に返信
>>プログラムB(サーバーでCOM登録するEXE)
>>「B.Class」というクラスを定義している。
>>実行ファイルをサーバーに配置して「B.EXE /REGSERVER」で登録する(旧環境導入手順ドキュメントより)
>>
>>IP指定する処理は今まで知らなかった手法なので調べるとDCOMというものと分かり
>>ひとまずB.EXEをVB.NETで作成し、COM登録として「B.EXE /REGSERVER」を実行したのですが
>>何もエラーは出ていないのですが「dcomcnfg」でDCOM一覧を見ても何も追加されておりませんでした。
>>
> B.EXE に、/REGSERVER というコマンドライン引数を処理するコードは追加していますか?

紛らわしい書き方をして申し訳ありません。
サーバーでのCOM登録で 「B.EXE /REGSERVER」を実行していてプログラムへの引数ではないつもりでした。

> VB6と、.NET Framework 時代のVBとは、いろいろな部分が違います。
> この「/REGSERVER」というコマンドライン引数もその一つです。
>
> もし、処理するコードを追加していて、それでもDCOMとして登録されていないようだということであれば
> DCOM登録処理をどうやっているかを開示すると、回答が得られるかもしれません。
>
>
> ちなみに。。。上記のように書いているからわかると思いますが、.NET はDCOMを直接的にサポートしてません。
> もっとも、.NET の COMサポートも、どちらかといえば互換性のためのレガシーサポートという形で見たほうがすっきりする構造ですが。
>
>
> クライアント側もサーバー側も全面再構築とするのなら、古くて面倒なDCOMを使うより、.NET がサポートするマシン間接続の方法を
> 用いて、接続部分も作り変えることをお勧めします。
>
> DCOMを直接的にリプレイスという形に近いのは、.NET Remoting とその発展形(今はWCFに統合)となりますし、
> より、パブリックな世界(サーバーはいずれクラウドへなど)とつなげるようにというのなら、Webサービスのようなhttp接続での
> ステートレスアクセスになるでしょう。
>
> どういう形がいいのか?については、DBアクセスや画像処理というだけでは何とも言えません。
>
> 最近の環境(VB6が出た当初のLANにおけるようなサーバーマシンだったら今どきのノートのほうがよっぽど高性能)だったら
> 下手にサーバーで画像処理するより、クライアントで処理したほうが高速ということもあるかもしれません。

.NET Remotingの回答を頂き試行していた所
.NETの資産をサービス化してOS起動時に実行し、そこにクライアントからアクセスする形で期待の動きをしてくれました。
セキュリティ面等まだ検証事項はありますが、そこは自力で解決に運ぼうと思います。
大変助かりました。ありがとうございました。


解決済み
引用返信 編集キー/
■73869 / inTopicNo.4)  Re[3]: VB6で作成していたDCOM用EXEをVB.NETでも利用
□投稿者/ とっちゃん (275回)-(2014/11/11(Tue) 11:20:25)
とっちゃん さんの Web サイト
No73867 (いけ さん) に返信

解決マークつけちゃってるのでもう見てないかもしれませんが...

>>B.EXE に、/REGSERVER というコマンドライン引数を処理するコードは追加していますか?
>
> 紛らわしい書き方をして申し訳ありません。
> サーバーでのCOM登録で 「B.EXE /REGSERVER」を実行していてプログラムへの引数ではないつもりでした。
>
「B.EXE /REGSERVER」がプログラムのファイル名ではありません。
「B.EXE」というプログラムに「/REGSERVER」という引数をつけて起動しているという形になっています。

自己登録自体はそれ全体で完結しているので、プログラムを実行しているという感覚ではないのかもしれませんが
一瞬で終了してしまう自己登録もプログラムの実行パターンの一つです。


>
> .NET Remotingの回答を頂き試行していた所
> .NETの資産をサービス化してOS起動時に実行し、そこにクライアントからアクセスする形で期待の動きをしてくれました。
> セキュリティ面等まだ検証事項はありますが、そこは自力で解決に運ぼうと思います。
> 大変助かりました。ありがとうございました。
>
>
.NET Remoting はあくまでも 1.x 時代のプロセス間通信規格で、COM/DCOM/COM+ といった動作ロジックを含むオブジェクトを
やり取りできるようにした仕組みです。
今は、これに加えその後台頭してきた様々な接続方法を取りまとめて、WCF(Windows Communication Foundation)としてまとめられています。
.NET Remoting がダメというわけではありませんが、より新しいWCFも一度精査してみることをお勧めします。

引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -