是否可以将同一个 DLL 放入控制台应用程序和 NuGet 依赖项中?

2024-04-21

我有一个面向 .NET Standard 1.5 的项目,该项目在 NuGet 上部署为多个 DLL。该项目是从 Java 移植的。项目内部的一些类是静态的Main()应该从命令行运行的方法。

在.NET Core中似乎有编译DLL的2种方法 https://learn.microsoft.com/en-us/dotnet/core/tools/project-json-to-csproj#emitEntrypoint:

  • <OutputType>Exe</OutputType>- 编译成可执行控制台应用程序(DLL)
  • <OutputType>Library</OutputType>(默认)- 编译成类库 (DLL)

我想知道有没有办法编译DLL以便可以使用它无论哪种方式没有 2 个独立的(令人困惑的)DLL?

基本上,我试图获得与 Java 中类似的功能,其中应用程序可以引用包or在命令行上运行(并在命令行中指定进入目标 https://stackoverflow.com/q/44829928/181087).

Example

例如,在 Java 中,有些文件都是包的一部分and包含静态Main(object[] args) method.

public class SomeClass
{
    public void DoSomething(string arg1, string arg2, string arg3)
    {
        // implementation...
    }

    public static void Main(object[] args)
    {
         // parse args...

         new SomeClass().DoSomething(arg1, arg2, arg3);
    }
}

DoSomething 在包内的其他地方引用(这相当于我的 NuGet 包现在的样子)。然而,在 Java 中Main(object[] args)可以从命令行运行,例如...

java <package>.jar <namespace>.SomeClass [args]

无需下载或安装任何额外的东西。毕竟,如果用户想要运行命令的组件在那里,那么所有依赖项也在那里。

理想情况下,我可以使用dotnet core 中的类似功能 https://stackoverflow.com/a/39155842/181087...

dotnet <assembly>.dll <namespace>.SomeClass [args]

这比必须围绕整个事情创建一个单独的包装器 DLL 更好,或者创建一个必须选择所有依赖项的单独项目SomeClass所以它们都被编译成一个程序集(控制台应用程序)。

此外,还有一些静态的Main()每个包的方法,这似乎已经在 .NET Core 早期支持,这就是我的其他问题 https://stackoverflow.com/q/44829928/181087是关于。


对于 .Net Standard/Core,您最好的选择是拥有第二个项目,该项目可以编译为 EXE,该 EXE 具有指向库版本的简单 Main() 方法。这并不理想,但问题是 .Net core 的运行时如何工作。面向 .Net Standard 的项目可以由与该标准版本兼容的所有项目使用。针对特定 .NetCoreApp 的项目只能由其他 .NetCoreApp 引用,因此您无法获得针对该标准的好处。

对于打包/NuGet 部署,可以将控制台应用程序版本放入 NuGet 的工具文件夹中,以便最终用户可以使用它。您确实不希望通过标准 NuGet 内容文件夹部署可执行文件,因为它不会真正遵循标准并且会让您的 NuGet 用户感到困惑。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将同一个 DLL 放入控制台应用程序和 NuGet 依赖项中? 的相关文章

随机推荐