違うディレクトリに存在するDLLを読みたい

このQ&Aのポイント
  • Visual Basic 2005で開発を行っている場合、別のディレクトリに存在するDLLを読み込む方法について求めています。
  • 購入したAソフトウェアが存在し、開発したBソフトウェアがAソフトウェアのDLLを利用しているが、リリース時に問題が生じている状況についての解決策を教えてください。
  • Microsoft Visual J# 2.0 再頒布可能パッケージに関しても、インストールは出来てもアプリケーションから参照することができない場合の解決策について知りたいです。
回答を見る
  • ベストアンサー

違うディレクトリに存在するDLLを読みたい

Visual Basic 2005で開発を行っています。 開発の時点では参照設定よりDLLを読み込んでいるので問題ないのですが、 リリース時に問題があって困っています。 例えば ・購入したAソフトウェア(a.dll)が存在する。 ・開発したBソフトウェア(b.exeとb.dll)が存在する。 ・Bソフトウェアのb.exeは、Bソフトウェアのb.dllを利用しており、  Bソフトウェアのb.dllは、Aソフトウェアのa.dllを利用している。 ・AソフトウェアとBソフトウェアのインストールタイミングは別である。 ・Aソフトウェアがインストールされた先はC:\Program Files\A_Software\a.dllである。 ・Bソフトウェアがインストールされた先はC:\Program Files\B_Software\b.exe(b.dll)である。 このような場合に、b.exeはb.dllを解決することが出来ますが、 b.dllはa.dllを解決することが出来ません。 また、a.dllはデフォルトインストール先はありますが、Bソフトウェアと インストールタイミングも別な為、どこにインストールされてくるか 分かりません。 その為、アプリケーション構成ファイルに参照パスなるものを指定して おくことも出来ません。 こういった場合、Bソフトウェアをインストール後に、Aソフトウェアのインストール先から a.dllをBソフトウェアのインストール先へコピーするなどという手動的作業が 必要になるのでしょうか? インストーラーを作成する場合にa.dllを含めてしまうとライセンスが 問題になることが多いと思います。 Microsoft Visual J# 2.0 再頒布可能パッケージ http://www.microsoft.com/downloads/details.aspx?FamilyID=f72c74b3-ed0e-4af8-ae63-2f0e42501be1&displaylang=ja これに関しても、インストールは出来てもアプリケーションから参照 出来ないというのではお話にならないと思うのですが、 どうやって解決しているのでしょうか? 宜しくお願い致します。

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

  • ベストアンサー
  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.1

アプリケーション構成ファイルに記述できるのも、実行ファイルがあるフォルダのサブフォルダのパスでしかないので、いずれにせよ無理ですね。 質問の答えになっていないのかも知れませんが、どう考えても a.dll を再配布するのが妥当だと思います。 購入されたのがどういう製品なのか知りませんが、大抵のものは再配布は許可されていますよ。dll として販売されている製品なのにそれが許可されていないようだと、使い物にならないと思います。再配布条件はどこかに書いてあると思いますが、わからなければ配布元に問い合わせてみればよいでしょう。 動かすだけならコピーしてもいいし、GAC にインストールする手もあるでしょう。ですが、アプリケーションの実行に必要なものは、アプリケーションと一緒に配布すべきです。それが .NET のアセンブリの配置の考え方です。 そもそも、dll 単体でインストールされるのがおかしいと思いますが…?単体でインストールされる dll なら、大抵どこからでも使えるように、GAC に自動的にインストールされるようになっているべきでしょう。

naktak
質問者

お礼

ご回答ありがとうございます。 GACへの登録は全く考えておりません。意味もありませんし、手動作業という 手間が発生するので。 「Microsoft Visual J# 2.0 再頒布可能パッケージ」はtlbのおかげで 関係ないみたいでした。 今回、機器とPCが通信するソフトウェア(Aソフトウェア)を利用し、 業務アプリ(Bソフトウェア)を考えています。 Aソフトウェアをインストールすると、機器の監視ツールなどと一緒に a.dllなどがインストールされるのです。 Bソフトウェアは、そのインストールされたa.dllを利用して開発する 感じなんです。 Aソフトウェア自体は購入する必要があるのですが、それをインストール すればdllが存在するのに、なぜ別ソフトウェアでそのdllを利用する場合に 別な場所に全く同じdllが存在していなければならないのかという意味の無さと、 独自で作成したソフトウェアの同梱物としてa.dllを含めてしまって良いのか という疑問からでした。 マニュアルや著作権などが記されているファイルを確認したのですが、 明確にどうとは記されていなかった為、どうなるのが普通なのかを 知りたかったのです。 ありがとうございました。

その他の回答 (1)

  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.2

なるほど、少し勘違いしていました。DLLとして販売されているものではなく、別のソフトのDLLを利用しようというお話でしたか。つまりBは、Aを自分で購入して所持しているユーザー向けに配布されるということですよね。 ではそもそも、Aの中にあるそのDLLは、ユーザーがそれを使用してプログラムを開発されることを前提としているようなものなのでしょうか?もしそうなら、再配布が可能かどうか、販売元に確認してみるのが一番だと思います。 もしそうでなければ、そういうものは用意されておらず、再配布も許可されない可能性が高いと思います。その場合そもそも、そういうソフトの開発自体を行っていいのかどうかも怪しいです。 再配布が許可されない場合、どうしてもやるとしたら、Bのインストーラのカスタム動作等で、A のインストールフォルダをユーザーが指定できるようにして、コピーするとかでしょうか。 ただし、それがライセンス違反になるのかどうかとか、そういう話については、私は詳しくないので回答できません。 > なぜ別ソフトウェアでそのdllを利用する場合に > 別な場所に全く同じdllが存在していなければならないのか 先にも書いた通り、アプリケーションの実行に必要なものは、アプリケーションと一緒に配布し、アプリケーションのディレクトリに配置するのが .NET の考え方です。 これはサイド・バイ・サイドと呼ばれるアセンブリのバージョン管理の考え方から来ているものです。仮にAのインストールフォルダにある a.dll を参照設定できたとして(実際にはできません)、もしBのインストール後にAをバージョンアップして a.dll のバージョンが変わると a.dll を読み込むことができなくなります。 .NET では a.dll というファイル名で参照するのではなく、厳密名と呼ばれるものでアセンブリを参照します。厳密名はアセンブリ名、バージョン名、公開キーを含んでいるため、バージョンが違うとそれは別のアセンブリとみなされてロードできなくなるのです。 というわけで、今回のケースでは、仮に全く同じ a.dll であったとしても、自アプリケーションのディレクトリに同じものを置くのが .NET では普通の考え方です。これならAがバージョンアップされても動かなくなったりすることもありませんし、AとBを同時に使用することもできます。この場合、Aが参照している a.dll と Bが参照している a.dll のバージョンが異なりますが、正しく動作します。これをサイド・バイ・サイドといいます。 ちなみにこれは、a.dll が厳密名を持っていると仮定しての話です。厳密名を持っていない場合は、「a.dll」という名前のみで参照されます。販売されているようなものなら、大抵は厳密名を持っていると思います。 ところで、a.dll ってマネージドアセンブリなんですよね?完全にそういう前提で回答していますが…

参考URL:
http://www.atmarkit.co.jp/fdotnet/technology/idnfw11_02/idnfw11_02_01.html
naktak
質問者

お礼

サイドバイサイドがどうたら、下位互換がどうたらという言葉はこの件について 調べていたら出てきたのですが、そういうことだったのですね。納得です。 ただそれだと一見、同じファイルが複数の場所に乱立してるような形に なるので個人的には好きになれません・・・。 販売元に確認してみたところ、作成したソフトウェアに同梱しての再配布 を想定しており、それを許可しているそうです。 また、そのdllを利用してプログラムを開発することを前提としている為 (というより、その開発を行うマニュアルすら存在する)、全く問題ない ようです。 それとすみません。お礼まで書いておいて、dllがどんなdllか書いてませんでした・・・。 マネージコードで生成されているdllなので、もうまさに的の射たご回答でした。 ありがとうございました。

関連するQ&A

  • mspdb80.dllが見つからない

    IntelFortranについての質問です。 VisualStudio2005をインストール→IntelFortranをインストールしたのですが,MeadowからM-x compile makeとやると,mspdb80.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションをインストールし直すと解決する場合があります。 とメッセージが出てリンクできません。全部アンインストール→VisualStudio2005をインストール→IntelFortranをインストールをやり直しても解決せず,(ぐぐったところによると普通はC:\Program Files\Microsoft Visual Studio 8\Common7\IDEのディレクトリにmspdb80.dllがあるはずなのに見つからず。。。なので当然そこにPATHを通しても解決せず) DOS窓からコンパイルするとリンクできるので今はそっちでやっているのですが,MEADOWで全部できるのならできた方が作業効率があがるので何とかして解決したいと思っています。 どなたか詳しい方いらっしゃいましたらよろしくお願いいたします。

  • Dドライブにmsdia80.dll

    Dドライブにmsdia80.dllが存在し 調べた結果一番大きなドライブに保存されるらしいとのことで どうしたものかと調べた結果 Microsoft Visual C++ 2005 Service Pack 1 再頒布可能パッケージをインストールすると解決する と書かれていたのですが相変わらずDドライブにmsdia80.dllが存在し C:\Program Files\Common Files\Microsoft Shared\VCにはありませんでした ほかのやり方を調べたところ msdia80.dllを以上の場所にいれコマンドプロントから regsvr32 "C:\Program Files\Common Files\Microsoft Shared\VC\msdia80.dll"と打ちまして DllRegisterServer は成功しましたと出たのですがこれで大丈夫なのでしょうか? またこれは再起動の際にいちいちコマンドプロントから打ち込まないといけないのでしょうか? 以下ファイル構造的なもの 《32bit》 C:\Program Files (x83)\Common Files\Microsoft Shared\VC  amd64(ファイル 中にはmsdia80.dll) msdia80.dll msdia90.dll msdia100.dll 《64bit》 C:\Program Files\Common Files\Microsoft Shared\VC\msdia80.dll msdia90.dll msdia100.dll と今回入れたmsdia80.dllがございます どなたかご存知の方がいらっしゃいましたら ご回答のほどよろしくお願いします

  • VC++2010のmsvcp100.dllについて

    私は、windows7 64bitで「Microsoft Visual C++ 2010 Service Pack 1 Compiler Update for the Windows SDK 7.1」や「Microsoft Windows SDK for Windows 7 and .NET Framework 4」 をインストールしました。 しかし、Message: Visual Studio C++ 2010のProgram Files (x86)\Microsoft Visual Studio 10.0\VC\redist\x86\Microsoft.VC100.CRT\msvcp100.dllが見当たりません。redistフォルダ自体が存在しません。 どうすれば、Program Files (x86)\Microsoft Visual Studio 10.0\VC\いかにredistフォルダとmsvcp100.dllを作成することができますか?

  • msvcr71.dll と msvcp71.dll

    msvcp71.dllは、C+ランタム msvcr71.dllは、Cランタムという プログラムですが、ソフトウェアを動作させる際に必要となるファイルでなにかのアプリケーションでインストールされるそうですがどんなときにインストールされるのでしょうか。 ネットで調べてみると、 「Microsoft C++ Runtime Library」とありますが。どのタイミングでインストールされるのか。 msvcp71.dllは、C+ランタム msvcr71.dllは、Cランタムが入っているPCと入っていないPCがあるのですが。なぜバラバラなのか。

  • gdiplus.dllを使わないプログラム開発

    はじめまして、 ”Microsoft Visual C++ 2008”にてダイアログベースのプログラムを書いています。 windows2000に対応するために、gdiplus.dllを使用しないプログラムを作成したいのですが、 新規作成したプロジェクトをそのままビルドしただけでもgdiplus.dllが読込まれてしまいます。 読込まなくするには、どのように設定を行なえばよいのでしょうか。 それとも”Visual C++ 2008”ではgdiplus.dllを使用しないダイアログベースのプログラム開発は不可能なのでしょうか。 動作対象OS:win2000(SPなし)以降 開発環境: 言語:Visual C++ 2008(visual studio 2008 professional edition) テンプレート:MFCアプリケーション アプリケーションの種類:ダイアログベース 以上、よろしくお願いいたします。

  • サイドバイサイド構成エラー

    サイドバイサイド構成エラーでアプリケーションが起動できずに困っています。 パソコン環境は、Windows7(64bit)です。 フリーソフト「neoStampa 8」のダウンロード後、そのショートカットを起動すると 次のエラーメッセージが表示されます。 *1) c:\Program Files(x86)\Inedit\neoStampa 8\cprint80.exe このアプリケーションのサイドバイサイドの構成が正しくないためアプリケーションを開始できませんでした。詳細については、アプリケーションのイベントログを参照するか、コマンドラインツール sxstrace.exe を使用してください。 イベントログで調査してみると "C:\Program Files (x86)\Inedit\neoStampa 8\cprint80.exe" のアクティブ化コンテキストの生成に失敗しました。 従属アセンブリ Microsoft.VC80.MFC,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="8.0.50727.762" が見つかりませんでした。 詳細な診断を行うには sxstrace.exe を実行してください。 となっていました。 そこで、インターネットよりMicrosoft Visual C++ 2005 SP1 再頒布可能パッケージ (x86)をダウンロードしました。 「コントロールパネル」-「プログラムと機能」で次の表示となっています。 Microsoft Visual C++ 2005 Redistributable 8.0.59193 「8.0.50727.762」より新しいバージョンと思われる「8.0.59193」ですが アプリを起動すると、*1)のエラーメッセージとなります。 なお、c:\windows\winsxsフォルダには、次のフォルダが作成されています。 x86_microsoft.vc80.mfc_1fc8b3b9a1e18e3b_8.0.50727.4053_none_cbf21254470d8752 この中に次の4ファイルが存在します。 mfc80.dll mfc80u.dll mfcm80.dll mfcm80u.dll 以上よろしくお願いします。

  • DLLファイルの破損

    IISアプリケーションをWindowsNT上で動作中、下記のエラーメッセージが画面上に出力されました。 「C:\Program Files\Common Files\designer\MSWCRUN.DLLからコントロール'WebClass'をロードできませんでした。 C:\Program Files\Common Files\designer\MSWCRUN.DLLのヴァージョンが最新のものではありません。アプリケーションから提供された最新のヴァージョンを使用しているかどうか確認してください。」 以前に上記MSWCRUN.DLLは最新のものを入れまして、1年以上動作させており、問題がありませんでしたので、その下層にある、VBのDLLである"A.DLL(仮名)"をregsrv32で一旦レジストリから離し、再度同じDLLをレジストリに登録し直すという方法で解決いたしました。 そこで、質問なのですが、この上記A.DLLに何らかの原因で 破損の状態が生じておったと考えていいのでしょうか? そして、なぜ、このような状態になるのでしょうか? MicrosoftのHPによると、Windows2000では、DLLファイルの破損状態を監視して、修復してくれるものがあると言ってましたが。

  • 実行体を別のマシンで実行させたい

    Windows Vistaマシン(PC)にインストールしたVisual Studio 2005でVC++により作製した実行体を、素の(Visual Studio 2005がインストールされていない)Windows XPマシン(PC)で、実行させたく存じます。 まず、Windows VistaマシンおよびインストールされているOSの詳細は、下記の通りです。 PC:プロセッサ  →Intel Core2 Duo CPU T7250 @ 2GHz   メモリ    →2GB   システムの種類→32bit OS OS:Windows Vista Home Premium SP2 次に、インストールしたVisual Studio 2005の詳細は、下記の通りです。 Visual Studio 2005:Version8.0.50727.867(vsvista.050727-8600) .NET FRAMEWORK :Version2.0.50727 SP2 次に、Windows XPマシンおよびインストールされているOSの詳細は、下記の通りです。 PC:プロセッサ  →Intel Celeron M processor @ 1.3GHz   メモリ    →512MB   システムの種類→32bit OS OS:Windows XP Home Version2002 SP3 次に、作製した実行体は、Visual C++ プロジェクトから「MFCアプリケーション」を選択し、Vistaマシン上でダブルクリックで実行するとウィンドウが発生し、ウィンドウ内には、ボタンが1つおよび入力テキストが1つ存在して「テキスト入力してOKならば、OKボタンを押下する」程度の簡単なプログラムをリンクしたものです。以下の要領でXPマシン側に実行体を移動し、実行体をダブルクリックで実行させようとしたのですが、いずれも「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決することがあります。」というダイアログが出現し、実行に失敗しました。以下、この実行体名を「text_input.exe」と称して失敗例を記述します。 1.「text_input.exe」をそのままXPマシンのROOTの直下に置いて実行した → NG 2.XPマシンに、   ・Microsoft .NET Framework Version 2.0 再頒布可能パッケージ (x86)   ・Microsoft .NET Framework 2.0 日本語 Language Pack (x86)   ・Microsoft Visual C++ 2005 再頒布可能パッケージ (x86)  をインストールした後、「text_input.exe」をXPマシンのROOTの直下に置いて実行した → NG 3.「text_input.exe」を作製する際、「stdafx.h」内で、#pragma宣言をして下記のファイルもリンクした   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcm80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcp80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\msvcr80.dll" )   #pragma comment( manifest, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT\Microsoft.VC80.CRT.manifest" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfc80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfc80u.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfcm80.dll" )   #pragma comment( dll, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\mfcm80u.dll" )   #pragma comment( manifest, "C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.MFC\Microsoft.VC80.MFC.manifest" )     その後、上記2項の状態のXPマシンのROOTの直下に「text_input.exe」を置いて実行した → NG いよいよ手立てがなくなりました。Windows並びにVisual Studioに精通されている方がおりましたら、素のWindows XPマシンで動作させる方法をご教示頂きたく、お願いいたします。

  • DLLとインポート、エクスポート

    環境 Microsoft Visual C++ DLLはWin32 Dynamic-Link Library ExeはWin32 Application で作成しています。 DLLにメッセージボックスを表示するのみの処理の関数があり。 Exe側でその関数を使用したいだけです。 DLLのヘッダファイルにエクスポートしたい関数を _declspec(dllexport) void exportmain(); としています。 Exeではインポートを __declspec(dllimport) void exportmain(); としています。 プロジェクト⇒設定⇒リンクにlibファイルの設定もしています。 dll、libファイルの場所も問題ないと思います。 しかし、ビルドすると「外部シンボル~~未解決です」とエラーがでてしまいます。なにか原因がわかるかたおりましたら、ご教授お願い致します。

  • VS2008 の C++ で作成したEXEの実行

    Visual Studio 2008 の C++(C++ではなくC)で作成した実行ファイルを、Visual Studio 2008 がインストールされていないが別のPC(WinXP)で実行すると、 「このアプリケーションの構成が正しくないため、アプリケーションを開始できませんでした。アプリケーションを再度インストールすることにより問題が解決する場合があります。」 のエラーが出るだけで実行できません。 同様な内容のQ&Aも見ましたが、解決できないので質問します。 なお、参考になるかわかりませんが、 ・Microsoft Visual C++ 2008 SP1 再頒布可能パッケージ  vcredist_x86.exe はインストールしてあります。 ・同じVisualStudio2008のC#で作成した実行ファイルは、正常に動きます。 ・別のPC(Win2000)では、 msvcr90d.dll を C:\WINNT\system32 フォルダに入れると、正常に動きます。 よろしくお願いいたします。

専門家に質問してみよう