DOBON.NET DOBON.NETプログラミング掲示板過去ログ

クラスライブラリに変更したい

環境/言語:[WindowsXP,VB.NET2003,NET Framework1.1 ]
分類:[.NET]

h.hayashiと申します。

現在、A.exeというWindowsアプリケーションから
B.exeというWindowsアプリケーションをShellで呼び出しています。
A.exeとB.exeで同じファイル(固定長1024バイト×5000件)を
読み込んでいますが、B.exe側のこの時間がもったいないので、
B.exeをクラスライブラリ(B.dll)に変更して、
A.exeで読み込み済みのデータをB.dllに渡し、
B.dll側で参照(更新)するように改良したいのです。

※読み込む固定長レコードのStructureの記述は、AもBも同じです
(コピー&ペースト)。

B.exeのソースコードをB.dll用に修正するための注意点等ありましたら
お教え願います。
> 現在、A.exeというWindowsアプリケーションから
> B.exeというWindowsアプリケーションをShellで呼び出しています。

> B.dll側で参照(更新)するように改良したいのです。
>
> B.exeのソースコードをB.dll用に修正するための注意点等ありましたら

文章からは独立した2つのアプリケーションのようですので
まずは役割を決めましょう。(Bのクラス設計で性質が決まります)
特にIOを含めデータの管理者は誰なのか。
BをDLLとすることで他の機能から見て再利用できないか。
BにIOとデータの提供以外の機能を含ませる場合は、何をさせるか。(何をAから分離させBで閉じるか)
また、エラー処理は分離から連動になるのでAがBのステータスを見て処理というのがメインになるでしょう。
■No14080に返信(まどかさんの記事)

まどかさん返信ありがとうございます。

> まずは役割を決めましょう。
A,Bの役割は決まっています。重複もありません。
Aで 個人・年月単位の データ入力・保存を行い、
Bでプレビュー表示・印刷を行います。
AB間のインターフェースも決まっていて
将来的にも変更はないと思います。

> 特にIOを含めデータの管理者は誰なのか。
ユーザー自身となります。
複数のユーザーが同じデータを共有することがないシステムなので
問題ないと思います。

> BをDLLとすることで他の機能から見て再利用できないか。
将来的にはAと類似のアプリケーションを開発し、Bを呼び出すこともあるかもと思うので
再利用は可能だと思いますが
Bを呼び出すインターフェースは現行のままで充分と今のところ考えています。

> BにIOとデータの提供以外の機能を含ませる場合は、何をさせるか。
Bの中での機能追加は考えていますが、Aとは無関係にします。

> また、エラー処理は分離から連動になるのでAがBのステータスを見て処理というのがメインになるでしょう。
B側でエラーが発生しそのエラー処理を行っていない場合
通常のエラーメッセージが表示され、[OK]ボタン押し下げ直後にBが終了し、Aにフォーカスが戻ります。
エラー処理を行っている箇所では
Bのステータスをメッセージボックスで表示して、B自身をDisposeさせ、Aに戻ります。
エラーメッセージの表示内容に何か工夫を入れるとかはできそうですが、
Aでの入力内容が多岐にわたっていて
B側のプレビュー用データ編集も複雑だし
法律がらみのシステムなので、法改正があるたびにソースコードのいろんなところに追加・修正・削除を入れる必要があるし
現実的には、エラーメッセージから プログラム・入力データ の不備を推測するぐらいのことしかできないと思います。
>>特にIOを含めデータの管理者は誰なのか。
> ユーザー自身となります。

あ、誰とは人間ではなくオブジェクトのことでした。(^^;

具体的な処理内容が無かったので抽象的というか仕組み的に書きました。
B.EXEだと原則任せっぱなしだしAが感知しないという風になってるはずで
それがB.DLLになることによりAが管理することになります。
AとBの関係、特にBの位置づけによってデータの位置づけがポイントになると思いました。
■No14109に返信(まどかさんの記事)

まどかさん、もう少し質問してもいいですか?

No14079で
>>※読み込む固定長レコードのStructureの記述は、AもBも同じです
>>(コピー&ペースト)。
と書きましたけど
Aのソース側で Public Structure udfS
B側でも Public Structure udfS
と定義しているとすると、
B.dll を呼び出す場合に、A側で
Dim bS() As ClassLibrary1.B.udfS の様に宣言し、
A側の Dim S() As udfSを各レコードのメンバ毎に移送しなければなりませんが
それならばA側で ... As udfS を 全て ... As ClassLibrary1.B.udfS
に書き換えればよいのでしょうか?
コードエディタで編集すればいいのかもしれないけど、何かもっとスマートなやり方ってあるんでしょうか?
> Aのソース側で Public Structure udfS
> B側でも Public Structure udfS
> と定義しているとすると、
> B.dll を呼び出す場合に、A側で
> Dim bS() As ClassLibrary1.B.udfS の様に宣言し、
> A側の Dim S() As udfSを各レコードのメンバ毎に移送しなければなりませんが
> それならばA側で ... As udfS を 全て ... As ClassLibrary1.B.udfS
> に書き換えればよいのでしょうか?

[B]
Public Structure udfS
End Structure
Public Function GetData() As udfS()
End Function

[A]
Private MyudfS() As B.udfS
MyudfS = B.GetData()

とか。

構造体宣言はデータを提供する側だけでよいですよね。
■No14136に返信(まどかさんの記事)

まどかさん、ありがとうございました。

できるだけA側でのコーディングで実現したい事情があるので下記のようにしてみました。
B.MainXを呼び出すのは1箇所だけです。
動作チェックではいまのところ不具合はありません。

[A]
Dim cS(UBound(pMyS)) As B.udfS 'pMyS()は[A]側で Public pMyS(5000) As udfS と宣言しています
copyMyS(pMyS, cS) 'copyMyS()は Public B.udfS型の配列へコピーを行うプロシージャです
Dim objDLL As New B.Class1
objDLL.MainX(cS)
> Dim cS(UBound(pMyS)) As B.udfS
のB.udfsと
>'pMyS()は[A]側で Public pMyS(5000) As udfS と宣言しています
のudfsは
同じですか?両方ともB.udfsですか?

> copyMyS(pMyS, cS) 'copyMyS()は Public B.udfS型の配列へコピーを行うプロシージャです

コピーする必要があるということは、やはり型は違うということですかね。
すべてがB.udfsでないというのはその「事情」が理由ですか?
■No14144に返信(まどかさんの記事)

まどかさん、ありがとうございます。

[A]も[B]も記述はまったく同じです。
Dim cS() As B.udfS = pMyS とやりたかったけど、「変換できません」というエラーになってしまうし
[A]側に ... As udfS という記述がいっぱいあるので
[B]側の ... As udfS にあわせるには
[A]側の部分を全て ... As B.udfS に書き換えなければならなくなるかなと思って(コーディング上は、Bは ClassLibrary1 と長ったらしいので)...
もう1つの理由は、将来[A]の usfS にメンバ追加があったとしても[B]に同じ追加が必要とは限らないし、
[B]側だけでメンバ追加することも機能上ありえないと考えられるからです。
今のところこの2つが理由といえます。
■No14151に返信(h.hayashiさんの記事)

まどかさん、いろんなご指摘をありがとうございました。
ここで解決済みとさせていただきます。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板