88022


C#でExcel用のCOMを作成しました。  
このCOMは以下のコマンドを実行することでVBEの参照設定に出てくることを確認しました。  
C:\Windows\Microsoft.NET\Framework\v4.0.30319\RegAsm.exe /codebase
**myCOM.dll**  
[![画像の説明をここに入力](https://i.stack.imgur.com/90Co2.png)](https://i.stack.imgur.com/90Co2.png)

ここからが問題で、このmyCOMはサードパーティ製の別のdllを参照しています。  
例えばExcel操作用のEPPlus.dllなど..

この場合、サードパーティ製のdllはどこかのディレクトリに格納する必要がありますでしょうか。  
それとも別のアクションが必要でしょうか。


CC BY-SA 4.0
2022-03-25T07:12:15.217
88020
2022-03-26T04:51:41.907
12388
question
c# com
C#で作成したCOM用 dllが別のdllを参照しているときのRegAsm.exeによる登録


サードパーティ製というからには、それは独立した商業製品でしょうから、それ用のインストーラーがあると思われます。  
そのインストーラーを使用して別途インストールすれば良いでしょう。

そういうものが無い場合は、組み込み方法が記述された資料が付いているでしょうから、それに従って作業を行えば良いでしょう。

いずれにしてもそのDLLのユーザーが任意に格納するようなことは無いと思われます。

* * *

ちなみに「EPPlus.dllなど..」と書かれているので複数あるのだと思いますが、それぞれのDLL毎に状況が変わるのではないでしょうか？

例えばEPPlusで検索すると、該当のDLLをコピーしておくだけでも使用できるようです。  
[VB.NET
EPPlusのインストールおよび使い方](http://note.websmil.com/vb/epplus/epplus%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%8A%E3%82%88%E3%81%B3%E4%BD%BF%E3%81%84%E6%96%B9)  
[PowerShellでExcelPackagePlusを使う | Finance &
Journey](https://f-journey.com/it/excelpackageplus_on_powershell/)  
[C#.NETでエクセルを操作するEPPLUSの基本の使い方](https://nokoshitamono.blogspot.com/2019/01/cnetepplus.html)  
[C#:EpPlus簡単な操作とダウンロードまで](https://startwind.work/blog/cepplus%E7%B0%A1%E5%8D%98%E3%81%AA%E6%93%8D%E4%BD%9C%E3%81%A8%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%BE%E3%81%A7/)

上記記事はおそらく質問のような他から呼ばれるライブラリからの更なる呼び出しでは無く、実行するアプリケーションやスクリプトから直接EPPlusが呼び出されることを想定しているやり方だと思われます。

ただしNuGetパッケージとして存在するようなので、貴方の作ったライブラリで必要なNuGetパッケージとして導入していれば、そのプロジェクト全体をインストーラ/あるいはデプロイ対象として作成すれば、使用できるかもしれませんね。

* * *

後述する課題があって、かつ正統的な対処方法は @sayuri
さんの回答となるでしょうが、裏技的なものとして[ILMarge](https://www.nuget.org/packages/ilmerge)を使って
DLL を一つにまとめてしまう、という方法があるかもしれません。  
こんな記事があって、複数の .NET DLLを1つのDLLにまとめることが出来るようです。

[How to merge multiple assemblies into
one?](https://stackoverflow.com/q/8077570/9014308)  
[C#でビルド後のファイルを1つに統合する（ILMergeを使う）](https://www.backyrd.net/entry/20200731/1596186585)

ただしこちらも今は保守されずに非推奨のようで、類似のものは[ILRepack](https://www.nuget.org/packages/ILRepack/)/[ILRepack.Lib.MSBuild.Task](https://www.nuget.org/packages/ILRepack.Lib.MSBuild.Task/)というものがあるようです。  
[.NET Framework アプリを単一ファイル化するのに ILRepack を使う... が、似たような NuGet
パッケージがいっぱいあるぞ問題](https://devadjust.exblog.jp/29125493/)  
[Merging assemblies using ILRepack](https://www.meziantou.net/merging-
assemblies-using-ilrepack.htm)  
[How to hide dependent Nuget .dll's from consuming parent .dlls - What is the
difference between 'Private Dependencies' and 'Merge / Repack'
dependencies?](https://docs.microsoft.com/en-us/answers/questions/702182/)

* * *

回答とは外れますが調べていたら色々と考慮が必要そうな情報を見つけました。

EPPlusの4系統以前はメンテナンス終了していますね。  
そしてEPPlusの5系統以後は非商用でのみフリーで使えるようです。  
[JanKallman/EPPlus](https://github.com/JanKallman/EPPlus)

[LGPL からポリフォームへ](https://www.epplussoftware.com/ja/Home/LgplToPolyform)  
[当社のライセンスタイプ](https://www.epplussoftware.com/ja/LicenseOverview)  
[EPPlusSoftware/EPPlus](https://github.com/EPPlusSoftware/EPPlus)

ユーザーに配布するといった場合に商用ライセンスがあるならこのサイトで聞くよりサポート窓口に聞いた方が早いでしょうし、非商用で5系統以後は対象が「非商業組織、例えば、慈善、教育、公共研究/安全/健康。」である必要があり、4系統以前はメンテナンス終了したソフトウェアを新規に使用開始し・使用し続けることになります。

「EPPlus.dllなど..」ということなので、上記を含むそれ以外のDLLについてもライセンスに合っているか・対象ユーザーが企業や組織なら定められているであろうセキュリティ関連ガイドライン/ポリシー/ルール等に沿っているかについて考えた方が良いと思われます。


CC BY-SA 4.0
2022-03-25T07:54:50.090
88022
2022-03-26T04:51:41.907
2022-03-26T04:51:41.907
26370
26370
88020
answer


.NET Framework と COM とでは、DLLの読み込み方が異なります。  
myCOMをRegAsmで登録しCOMとしてExcelから読み込もうとされていますが、読み込まれたmyCOMは既に.NET
Framework上で動作していますから、COMのことは考慮不要です。

で、.NET FrameworkでのDLLの読み込み方については、 [How the Runtime Locates
Assemblies](https://docs.microsoft.com/en-us/dotnet/framework/deployment/how-
the-runtime-locates-assemblies) （[訳がアレな日本語](https://docs.microsoft.com/ja-
jp/dotnet/framework/deployment/how-the-runtime-locates-assemblies)）で説明されています。

一般的には、

  1. 読み込むアプリケーション側が Application Configuration File でパスを指定する
  2. 読み込まれるDLLを Global Assembly Cache に登録する

が説明されています。ただし、どちらも現実的ではありません。COMとして読み込まれる場合、「読み込むアプリケーション」はExcelなどになり、`excel.exe`と同じディレクトリに`excel.exe.config`として記述する必要が出てきます。他のアプリケーションから読み込む場合はまた変わってきます。また、myCOMからだけ使われるであろうDLLをGlobal
Assembly Cacheに格納するのもはばかれます。

* * *

ではどうすればいいかというと、他の選択肢として[アセンブリ読み込みを解決する](https://docs.microsoft.com/ja-
jp/dotnet/standard/assembly/resolve-
loads)で説明されていますが、[`AppDomain.AssemblyResolve`
Event](https://docs.microsoft.com/en-
us/dotnet/api/system.appdomain.assemblyresolve?view=netframework-4.8)があります。このイベントはアセンブリ（DLL）を検索する際に呼ばれます。このタイミングで[`Assembly.LoadFrom`
メソッド](https://docs.microsoft.com/ja-
JP/dotnet/api/system.reflection.assembly.loadfrom?view=netframework-4.8#system-
reflection-assembly-loadfrom\(system-string\))などでフルパス指定で読み込むことができます。


CC BY-SA 4.0
2022-03-25T23:11:24.060
88027
2022-03-25T23:11:24.060
4236
88020
answer