ここでは一風変わった、C++の.dllにC#で作ったクラスを直接スタティックリンクしてしまう、といった手段をご紹介します。
WindowsのC++には、C++/CLIという混成アセンブリを作成出来る言語が存在するため、
C++プロジェクトとC#プロジェクトを一緒のソリューションの中に入れ、
そのまま1つの.dllとしてコンパイルしてしまうことが可能となっています。
C#側とC++/CLI側の.NETのバージョンは一致させる必要があります。
例えば、.NET Framework 4.5.2であれば、両方ともそのバージョンを指定します。
C#側は「ANYCPU」でコンパイルします。
そして、「Module」の指定をします。
Moduleの指定はGUI上ではできません、「.vcxproj」ファイルを直接編集します。
「Module」という指定をしておくことで、C#側はコンパイル時に、
「.dll」ではなく、「.netmodule」という拡張子のファイルとなります。
C++/CLI側の参照には、C#側の「プロジェクト」そのものを参照で追加しておきましょう。
C++/CLI上でC#のクラスを利用した場合、当然その実態がC++側に存在しないことになりますので、
静的リンクの対象として、.netmoduleを指定します。
以上で、C++/CLIとC#がソース中に混ざっていても、1つの.dllにコンパイル出来ます。
C#のdynamic型はC++/CLIには存在していません。
とりわけC#側のメソッドの返り値がdynamic型である場合には、C++/CLI側で対処しようとはせず、
C#側で一旦「dynamic型が無いメソッドの形へとラップ」し、
そのラップしたメソッドをC++/CLI側から利用するようにしてください。
.NET6.0でもC++/CLIへとリンク可能な netmodule生成サポートされています。
下記のような形とし、出力された.dllを.netmodule とすればC++/CLIへとリンクが可能となります。