【发布时间】:2020-12-25 16:35:33
【问题描述】:
我正在为 .Net 框架应用程序编写插件(即具有特殊入口点的 .Net 4 库),但我也想将功能公开为独立的 CLI 可执行文件。
当前目录布局如下:
Directory.build.props // shared configuration, e.g. author name, project name
FooPlugin/FooPlugin.cs
Foo/FooPlugin/FooPlugin.csproj
Foo/FooLib/FooLib.cs
Foo/FooLib/FooLib.csproj
Foo/FooExe/FooExe.cs
Foo/FooExe/FooExe.csproj
Bar/BarPlugin/…
FooLib 是一个 .Net Standard 2.0 库,具有 FooLib.cs 中的全部功能,FooPlugin 是一个 .Net 4.8 库,带有插件的入口点 FooPlugin.cs 和 FooExe 是一个 .Net Core在FooExe.cs 中使用FooLib 的CLI 包装器可执行。到目前为止,一切顺利。
这种方法有两个主要问题:
-
FooPlugin依赖于几个特定于应用程序的仅限 Windows 的程序集,所以我不能只从根目录中dotnet build,因为 msbuild 也尝试构建FooPlugin,我还没有弄清楚如何有条件地排除解决方案文件中的子项目。 -
每个插件(和 CLI 应用程序)都有两个文件(
FooPlugin.dll和FooLib.dll/FooExe.dll和FooLib.dll) which in itself isn't that bad, but my users ignoreFooLib.dlland then complain.ILMerge` 看起来很有希望,但它的配置是比整个剩余的构建配置加起来要复杂得多。
在 CMake 中,我只会写
add_library(FooLib STATIC FooLib.cpp)
add_library(FooPlugin SHARED FooPlugin.cpp)
target_link_libraries(FooPlugin PRIVATE FooLib)
add_executable(FooExe SHARED FooExe.cpp)
target_link_libraries(FooExe PRIVATE FooLib)
并将FooLib 合并到FooPlugin.dll 和FooExe.exe。
我已经考虑过将FooLib 中的(少数)源文件的符号链接放入FooPlugin 和FooExe,但是Windows 上对符号链接的支持还不是很好。
我可以在 msbuild 中定义目标以自动合并到程序集中吗?
【问题讨论】: