VB.NETで参照設定したDLLの修正反映

このQ&Aのポイント
  • VB.NETで開発している場合、参照設定したDLLを修正した場合にはリビルドが必要ですか?
  • 「Const.dll」を修正しても、参照設定先のモジュールは仕様変更前のパスで処理しようとしてしまいますか?
  • 参照設定先のモジュールを修正した場合、参照設定元のモジュールもリビルドが必要ですか?
回答を見る
  • ベストアンサー

VB.NETで参照設定したDLLの修正反映

VisualStudio2008で開発をしています。 共通定数を『Const.dll』として作成しています。 「Const.dll」には「Public Const TEST_PATH AS String = "C:\Temp";」のように、パスが記載されています。 利用側モジュール(ex. Test.exe)で、それを参照設定して利用しています。 仕様変更によりパスが変更になり、「Public Const TEST_PATH AS String = "C:\Temp\test";」のように「Const.dll」を修正しました。 基本的な勘違いかもしれませんが、「Const.dll」を修正したことにより、利用側モジュールも再度リビルドしなければいけないのでしょうか。 参照設定なので、リビルドしなくても、利用側モジュールが起動したときに、「Const.dll」を読み直しして、仕様変更後のパスで処理をおこなうだろうと思っていたいのですが、 リビルドしていない状態であれば、「Const.dll」をいくら変更しても、仕様変更前のパスで処理しようとしています。 参照設定先のモジュールを修正した場合、参照設定元のモジュールもリビルドしなおさなければならないのであれば、あまり参照設定の旨味がないような気がしています。 参照設定そのものに問題があるかもしれません。 情報が不十分であれば、その旨お願いいたします。 申し訳ありませんが、教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • todo36
  • ベストアンサー率58% (728/1234)
回答No.3

ConstではなくShared ReadOnlyにしましょう。 Public Shared ReadOnly TEST_PATH As String = "C:\Temp"

yasuval
質問者

お礼

ご回答いただいた内容で解決しました!ありがとうございました! 他のご回答いただいた方もご協力ありがとうございました!

その他の回答 (2)

  • _backyarD
  • ベストアンサー率34% (199/580)
回答No.2

その程度の修正であれば、普通は利用側(参照している方)はビルドし直す必要無く、古いDLLに上書きコピーするだけでOKのはずです。 念のため確認ですが、まず、 ・古いのを参照しているというのは、  参照する側のVisual Studio上での動きか?  それとも、参照する側をビルドして、VisualStudioを介さずに  動かしたときの話か? この点がちょっとよく分かりません。開発環境か、稼働環境かということですね。稼働環境であれば、冒頭に書いたとおり「これまでのConst.dllに新しいConst.dllを上書きするだけ」です。 Visual Studio上での動きについてであれば、まず確認すべきなのは ・変更したConst.dllの完成品を、Const.dllを利用する(参照する)ソースが  参照している場所に正しく置いていますか? ですね。参照先のパスはプロジェクトのプロパティに出ているはずなので、そのフォルダに「新しいConst.dllが置いてあるか」を確認するのが先決です。置いてあるのに参照がおかしい場合、ありそうなのは「ローカルコピーがFalseになっていて、参照しているフォルダと、デバッグモードなどで動かすときのフォルダに違うバージョンのConst.dllが入ってる」というようなケースですね。 基本、ローカルコピーはTrueのまま使うのをお勧めします。そうすれば、参照先とVisual Studio上での動作フォルダのDLLは同一になるので、普通は問題になりません。 なお、この手の問題を回避/予防/検出する良い方法として、DLLのバージョン番号を変更のたびに更新し、機能の変更とバージョン番号の対応をきちんと記録しながら「今使ってるDLLはどのバージョンか」がバージョン番号で判るようにするというものがあります。 一旦混乱が起きると、ちょっとした間違いでもあっという間に時間を消費するので、面倒かもしれませんがこうした管理をきちんとすることでトータルの作業時間は少なくなりやすいです。 ダラダラ書きましたが、参考になれば幸いです

yasuval
質問者

補足

申し訳ございません、古いのを参照しているのは「参照する側はビルドせず、VisualStudioを介さずに動かした場合」です。 そして参照設定で、「ローカルコピー = True」にしています。 基本的には上書きするだけ、というイメージはあっているということですね。認識相違がなくて良かったです。 ただ、動作が想定どおりでないので、困ってはいますが。 さらに現状を詳しく書かせていただくと、 実行EXEを起動すると、別出しで処理を記載しているDLL((1))を呼び出します。 (1)の別だし処理DLLで、質問させていただいた「Const.dll」をImportし、(1)の処理を行っています。 新しい「Const.dll」の参照設定が正しいことを確認した上で、 DLL((1))を再ビルドすると、変更後パスで処理するようになりました。「Const.dll」を上書きしても、再ビルドしていないDLL((1))では、変更前パスで処理しようとしています。 他に何か考えられることはありませんでしょうか。 お手数をお掛けしますが、よろしくお願いします。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

参照設定で指定したDLLをローカルコピー=Trueにしていませんか? つまり 他の場所にあるDLLを自分のプロジェクトの出力フォルダーにコピーする設定ですとご質問のような現象になると思います

yasuval
質問者

補足

ご回答ありがとうございます。 参照設定のローカルコピーをFALSEにしても、同様の事象が発生してしまいます。 ビルドした利用側モジュールのなかには、Const.dllの情報も含まれているのでは、と思ってしまいます。

関連するQ&A

  • VB.NETで参照設定

    Visual Basic .NET について質問致します。 VB 6.0は使用していたのですが、.NETに関して初心者です。 VSSにてファイル管理をしています。 共通で使用するためののオリジナルDLLを作成し 参照設定をしているのですが、参照パスがフルパスで設定されているため (プロジェクトのプロパティページの「参照パス」のフォルダのところ) VSSから最新プロジェクトファイルを取得した後 いつも参照パスを自分のローカルのパスに変更しなおさなければいけません。 とても効率が悪く、もっといい方法があるかと思うのですが、 教えていただきますようお願い致します。

  • VB6.0で、DLLを動的に参照したい

    VB6.0では、DLLを利用する際の宣言部分で、パスを""で括った静的な記載でなく、動的な記載にできるのでしょうか。 色々と調べてみたのですが、イマイチピンとくるものがなかったので質問させていただきました。 例:Public Declare Function Ztest Lib "C:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long                           ↓動的に変更したい   Public Declare Function Ztest Lib "○○:\Test1\Test2" Alias "Test3" (ByVal data1 As Long) As Long

  • VB6から参照可能なDLLの作成

    VB6から参照可能なDLLの作成を参考書をみながらしましたが、上手くいかない為質問させていただきます。 開発環境VC++ 2005 C++ CTEST.dll #include <windows.h> __declspec (dllexport) int __stdcall test(int i) { i = i + 5; return i; } .defファイル LIBRARY "test" DESCRIPTION EXPORTS A 以上でDLLを作成し、VB6側で Private Declare test Lib "CTEST.dll" (ByVal i as integer) で宣言しても「エラー53 ファイルがみつかりません」と表示されます。「参照の追加」から参照しようとしても「このファイルは参照できません。」をエラーがでてしまいます。 直すべき点はどの部分なのでしょうか? ご教示ねがいます。

  • VB .NetのDLL参照について

    名前付パイプの処理をしているのですが、DLLが参照できません。 Public Class ClsJi01   Public Declare Function MakePipe Lib "\DLL\Point.DLL" (ByVal pipe_name As String, ByVal buf_size As Integer, ByVal max_instances As Short, ByVal hpipe As Integer, ByVal err_code As Integer) As Integer  Public Sub M_Pipe()   Dim r As Integer   Dim rpipe As Integer   Dim err_code As Integer   r = MakePipe("\\.\pipe\RS04", 255, 16, rpipe, err_code)  End Sub End Class Point.DLLは以前VB6.0の時に使用していたDLLで自作です。 これで実行すると「オブジェクト参照がオブジェクト インスタンスに設定されていません。」と出ます。 どうしたら良いのでしょうか?

  • VB6.0からVB.NETへの移行

    VB6.0から.NETへの移行を行うこととなりましたが、C++で作成したDLL呼び出し方法がわからず悩んでいます。 C++側で作成したDLLは修正が出来ない為、.NET側のみで修正しなければならない状況です。 VB6.0側のプログラムは以下のような感じです。 Public FName() As String Declare Function A Lib "Test.dll" (ByRef field As Variant) As Long ReDim FName(4) As String FName(1) = "1" FName(2) = "22" FName(3) = "333" FName(4) = "4444" Call A(fieldName) C++側は、以下の形で受けているようです。 A(variant *field); SAFEARRAY *psa = *(field->pparray); VB.NET側で以下の様にしてみたのですが、まともに動いてくれません。 Public FName() As String Declare Function A Lib "Test.dll" (ByRef field As Object) As Integer ReDim FName(3) As String FName(0) = "1" FName(1) = "22" FName(2) = "333" FName(3) = "4444" Call A(FName) VB.NETに詳しい方であれば、すごく基本的なことなのではないかと思いますが、よろしくお願いいたします。

  • VB.NET DLL 参照型String読込み

    VCで作成されたDLLの参照型Stringの読込みに困っております。 ご存じの方、お教え下さい。 VB6では次のような定義で、問題なく実行できます。 Private Declare Function VcToVb _ Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Long, _ ByRef strData As String, ByRef Err_Cnt As Long, ByRef Err_DATA As String) As Long ------------------------------------ Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) これを VB.NETで実施 Private Declare Ansi Function VcToVb _  Lib "xxxxxxx.dll" Alias "VcToVb" _ (ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Int32, _ <MarshalAs(UnmanagedType.LPStr)> ByRef strData As StringBuilder, _ ByRef err_cnt As Int32, ByRef Err_DATA As StringBuilder) As Int32 (テストのため、strDataのみ) -------------------------------------- Out_Str , Err_Str の領域を確保 iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR) ******************************************* 調べた結果、VB.NETでは参照型は簡単にはいかないみたいで、StringBuilderを使用するとか、色々な方法を試しました。 結果は戻ってくるのですが、問題は DLLが文字列を返すときに、文字列内の項目区切文字として chr(0)を設定します。 このため、結果は Chr(0)の前までしか設定されません。 (VB.NETが Chr(0)を文字列の最後と判断する?) これを解決する方法はありますでしょうか。 現在は VB6で呼出す DLLを作成し、VB.NETはこれを使用していますが、 C#.Netならできるのでしょうか。 よろしくお願い申し上げます。

  • VB6でバイナリ互換でDLL作成するには?

    VB6.0にてActiveX DLLで開発をしたいのですが、 プロジェクトのプロパティ.コンポーネントにてバイナリ互換を選択すると バージョン互換コンポーネントを設定できません。というエラーメッセージが出て、 DLLを作成できません。 プロジェクトはフォーム1画面、標準モジュール複数、クラスモジュールで構成されています。 DLL作成手順のアドバイスをお願いします。 もう1点、 ある程度、開発できたら単体テストを行います。 その際は現場で用意されているテスト起動画面を使用するように言われたのですが、 この方法だと自分の担当画面に修正を加えるたびに下記1~3の作業を行う 必要があると思うのですが、もっとスマートな方法はないのでしょうか? 1.修正したプロジェクトを保存してdllを作成する。 2.作成したdllを所定の場所(現場で指示された場所)に格納 3.テスト起動画面からそのdllを指定して単体テスト

  • DLL VBとC++

    VBAからVC++2005のDLLを呼び出すプログラムを書いています。 VB側で作成したcpp_proc関数を呼ぶとVBアプリ自体が落ちました。 DLLのreturnの直前に以下のMessageBoxで表示させるとそこまでは表示され、 リターンを押すと、落ちました。 VB側の引数の値 String * 8192が悪いのでしょうか? return直前まで動作していたので、DLLの戻り値に何か原因があるのでしょうか? ついでの質問ですが、DEFの @1は無くても動くのでしょうか? 意味が知りたいです。 // ----- C++ (DLL側) ----- int __stdcall cpp_proc(LPCSTR inp, LPSTR out) { ... 省略 MessageBox(0, "ここまで通過", "debug", MB_OK); return 0; } // ----- DEF ----- LIBRARY "example" DESCRIPTION 'テスト' EXPORTS ; 明示的なエクスポートはここへ記述できます cpp_proc @1 '----- VB側 ----- Public Declare Function cpp_proc Lib "example.dll" _ (ByVal inp As String, ByRef out As String) As Integer Public Sub Test() Dim ret As Integer Dim inp As String Dim out As String * 8192 ret = cpp_proc(inp, out) MsgBox("ret=[" & Cstr(ret) & "]"); End Sub

  • VB2005 から DLL を呼び出す

    VB 初心者です。 今、VB の練習ということで VB 2005 Express Edition を使って、個人用ブラウザをつくっています。Web ページの表示は Webbrowser コンポーネントを使っています。 その仕様で、閲覧先によって HTTP Proxy を変更するようになっています。(自分で決めたんですが) いろいろ調べてみると、urlmon.dll の UrlMkSetSessionOption() を呼べば自分のアプリケーション限定で Proxy を変更できるようだ、ということがわかりました。 古い VB など(VB 6 とか?)では、 Private Declare Sub UrlMkSetSessionOption Lib "urlmon.dll" _ (ByVal dwOption As Long, ByVal pBuffer As Any, _ ByVal dwBufferLength As Long, _ ByVal dwReserved As Long) このような感じで宣言するとかあったんですが、VB2005 では Any がダメだとか、 Type INTERNET_PROXY_INFO Dim dwAccessType As Long Dim lpszProxy As String Dim lpszProxyBypass As String End Type で Type はダメだとか、呼び出し側で、LenB を使おうとしたら使えないだとか、INTERNET_OPTION_PROXY の値がわからないなど、問題が山積みです。 上記 DLL を VB 2005 で使ったことがある人がいたら(またはわかる人)、使い方を教えてもらえないでしょうか?

  • VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてく

    VB6.0(SP6)にて開発を行なっています。参照設定に関して教えてください。 ソースコードはVSS(VisualSourceSafe)にて管理しています。 3つのフォルダにそれぞれVB6.0のプロジェクトがあります。 C:. +---フォルダ1 | ProjectA.dll ←このdllはVSS管理されていない。 | ProjectA.vbp | +---フォルダ2 | ProjectB.dll ←このdllはVSS管理されていない | ProjectB.vbp | \---フォルダ3 ProjectC.exe ←このexeはVSS管理されていない ProjectC.vbp 上図にはdllファイルもexeファイルも記載してありますが、dllファイルとexeファイルはVSSでは管理(登録)しておりません。各開発担当者はVSSから最新のソースコードを取得して、各自のローカル環境でビルドを行なってdllやexeを生成します。 ProjectA.vbpはProjectA.dllを生成します。 ProjectB.vbpはProjectB.dllを生成します。 ProjectC.vbpはProjectC.exeを生成します。 ここでProjectC.vbpはProjectA.dllとProjectB.dllを参照しています。 ここからが質問なのですが、A君の環境でProjectA.dllとProjectB.dllを生成したあとProjectC.vbpをビルドすると問題なくProjectC.exeが生成できます。ところが、B君の環境で同じことをやろうとすると、ProjectA.dllとProjectB.dllを生成まで問題なくできるもののProjectC.vbpをビルドしてProjectC.exeを生成する際に、ProjectA.dllとProjectB.dllが参照エラーとなってしまいます。参照設定をし直せばB君の環境でもProjectC.vbpをビルドしてProjectC.exeを生成できるようになります。ところが、参照設定し直したProjectC.vbpをVSSにチェックインして、A君の環境で最新ソースを取得してProjectC.vbpをビルドしようとすると今度はA君の環境でProjectA.dllとProjectB.dllが参照エラーとなってしまいます。 各開発担当者のローカル環境で参照設定をしなおさずに済むようなプロジェクトの設定方法がありましたら教えていただけないでしょうか。よろしくお願いします。 (なお、変更したのはProjectCの参照設定のみであり、ProjectAとProjectBには一切変更箇所はありません。)

専門家に質問してみよう