none
コンパイル時のファイル名を指定する事はできますか? RRS feed

  • 質問

  • Visual Studio Express 2013 for Windows Desktop (Update 3) で 主に Visual Basic を使用して開発をしています。

    稀に C# も使います。

    コンパイル時のファイル名(*.exeまたは*.dll)を指定する事はできますか?

    プロジェクトのプロパティのアセンブリ名とは異なるものを指定したいのです。

    よろしくお願い申し上げます。




    • 編集済み VB User1 2014年10月8日 7:17
    2014年10月8日 7:15

すべての返信

  • 記憶にある限り不可能なはずですが、何故そんな要望が出てきたんでしょうか…。
    2014年10月8日 7:39
  • ビルド後にリネームすること自体はできそうかな…。ただしファイル名とアセンブリ名が一致していないことによりアセンブリをロードできなくなるパターンもありそうですが。
    # GACに登録されていればアセンブリ名で解決するからロードできるかな?

    とはいえ、目的が気になります。

    2014年10月8日 8:25
  • Hongliangさん、佐祐理さん
    コメントありがとうございます。
    どうやら Visual Studio でアセンブリ名と異なるファイル名をつけるのは難しいということでしょうか?
    うろ覚えですが、Visual C++であれば簡単にできたような記憶があるので、VBやC#でも可能かと思い、質問してみました。

    目的ですが、私と全く関係のない第三者が作成したプラグイン式のアプリケーションがあります。
    私はそのプラグインを開発しているのですが、プラグインとして認識するDLLのファイル名が決まっております。
    しかし、アセンブリ名もすべて同じというわけにはいかないので、必然的にDLLのファイル名とアセンブリ名が異なる必要があるというわけです。


    2014年10月9日 14:18
  • しかし、アセンブリ名もすべて同じというわけにはいかないので、必然的にDLLのファイル名とアセンブリ名が異なる必要があるというわけです。

    なぜ「アセンブリ名もすべて同じというわけにはいかない」のでしょうか。GACに登録することを想定してます?

    2014年10月9日 14:48
  • うろ覚えですが、Visual C++であれば簡単にできたような記憶があるので、VBやC#でも可能かと思い、質問してみました。

    nativeと.NETでは仕組みが異なります。nativeではLoadLibrary()を使いますがこの時指定するのは「ファイル名」です。一方.NETではAssembly.Load()Assembly.LoadFrom()が用意されています。どちらも引数はstringですが、前者は「アセンブリ名」、後者は「ファイル名」を指定します。アセンブリ名とファイル名は明確に異なる存在です。

    Hongliangさんが指摘されていますが、.NETで読み込む際にどちらのメソッドを使用しているかということです。アセンブリ名を指定して読み込む場合には複数のプラグインDLLが存在する場合にそれぞれ異なるアセンブリ名を与える必要がありそうですが、ファイル名を指定して読み込む場合にはアセンブリ名が重複していても.NETは混乱することなく各々を扱えます。(開発者が混乱することはあり得ますが。)

    2014年10月9日 22:50
  • プラグインルートディレクトリ

    ├─プラグイン1ディレクトリ
    │      Plugin.dll

    └─プラグイン2ディレクトリ
            Plugin.dll


    このような構造なのですが、DLLファイル名は上記のように決まっているようで、異なるファイル名を指定しても認識しませんでした。
    また、上記のDLLファイル名でアセンブリ名を同じにした場合、先に読み込んだもののみ使用可能で、もう一方は読み込めませんでした。

    アセンブリ名を異なるものにすると、上記プラグインが2つとも認識する状態です。
    2014年10月9日 23:04
  • nativeと.NETでは仕組みが異なります。nativeではLoadLibrary()を使いますがこの時指定するのは「ファイル名」です。一方.NETではAssembly.Load()Assembly.LoadFrom()が用意されています。どちらも引数はstringですが、前者は「アセンブリ名」、後者は「ファイル名」を指定します。アセンブリ名とファイル名は明確に異なる存在です。

    Hongliangさんが指摘されていますが、.NETで読み込む際にどちらのメソッドを使用しているかということです。アセンブリ名を指定して読み込む場合には複数のプラグインDLLが存在する場合にそれぞれ異なるアセンブリ名を与える必要がありそうですが、ファイル名を指定して読み込む場合にはアセンブリ名が重複していても.NETは混乱することなく各々を扱えます。(開発者が混乱することはあり得ますが。)

    LoadFromの場合はパス指定ですが、一度読み込んだアセンブリと同一のID(厳密名がない場合は単にアセンブリの名前のはず)のアセンブリを再度読み込もうとすると、新しくロードはされず、以前の読み込み済みのアセンブリが返されます。

    プラグインの読み込みの実装がもしLoadFromであれば、アセンブリ名を変えないと個別に読み込めないということになります。アセンブリ名を変えれば、IDが異なるため、個別に読み込み可能です。

    LoadFileの場合は、IDが同じでもパスが異なれば個別に読み込むことができたと思いますが、うまく動かないということはおそらくLoadFromで実装されているのではないかと思われます。

    --追記

    アセンブリのIDには、名前、バージョン、カルチャ、プロセッサアーキテクチャなども含まれていますね。
    実質的にはアセンブリの名前部分しか意味ないとは思いますが(バージョンは使えますがさすがに目的が違う)。

    2014年10月10日 0:58