C#中,运行程序时提示:无法直接启动还有类库输出类型的项目?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#中,运行程序时提示:无法直接启动还有类库输出类型的项目?相关的知识,希望对你有一定的参考价值。

C#中,运行程序时提示:无法直接启动还有类库输出类型的项目,怎么办?

你这里是建立类库,是不能直接运行的,跳出这个提示说明你的语法没有错误,可以运行。

如果想调试运行这个程序可以建立一个窗体程序或者控制台程序如下图

参考技术A 类库项目是不能启动的,如果是C/S的代码,把你的控制台程序右键设置为启动项目。 参考技术B 在你的程序 入口的cs文件,
右键,设为启动项目

运行时获取类库信息

运行时获取类库信息

Intro

在我们向别的开源项目提 issue 的时候,可能经常会遇到别人会让我们提供使用的版本信息,如果别的开源项目类库集成了 source link,我们可以从程序集信息中获取到版本以及对应的 commit 信息,这样我们就可以直接找到对应版本的 commit 对应的代码版本,这样也就可以更加方便的了解对应源码了

那我们是不是也可以在运行时获取类库的 commit 信息呢,答案是肯定的

Sample

我们集成了 source link 的话,在程序集信息中是可以获取到 git 相关的信息, source link 的单步调试也是基于此来扩展的调试时下载对应源文件的

这里是我集成了 source link 的一个开源项目,反编译 dll 的时候可以看到一些 git 相关的信息

AssemblyInfomationVersion 中的信息由两部分组成,一部分是原始的 package 版本号,另外一部分是对应 commit hash,我们结合 RepositoryUrl 就可以很方便的找到对应的代码了

RepositoryUrl 则是在一个 AssemblyMetadata 的 attribute 中

Implement

我们可以定义一个 model 来表示程序集的信息,这样以后扩展起来也会更加的方便,示例如下:

public class LibraryInfo

    public required Version LibraryVersion  get; init; 
    public required string LibraryHash  get; init; 
    public required string RepositoryUrl  get; init; 

然后通过反射从程序集中获取程序集的信息

public static LibraryInfo GetLibraryInfo(Assembly assembly)

    Guard.NotNull(assembly);
    var assemblyInformation = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>();
    var repositoryUrl = assembly.GetCustomAttributes<AssemblyMetadataAttribute>()
        .FirstOrDefault(x => nameof(LibraryInfo.RepositoryUrl).Equals(x.Key))?.Value ?? string.Empty;
    if (assemblyInformation is not null)
    
        var informationalVersionSplit = assemblyInformation.InformationalVersion.Split('+');
        if (Version.TryParse(informationalVersionSplit[0], out var version))
        
            return new LibraryInfo()
            
                LibraryVersion = version,
                LibraryHash = informationalVersionSplit.Length > 1 ? informationalVersionSplit[1] : string.Empty,
                RepositoryUrl = repositoryUrl
            ;
        
    
    return new LibraryInfo()
    
        LibraryVersion = assembly.GetName().Version!,
        LibraryHash = string.Empty,
        RepositoryUrl = repositoryUrl
    ;

为了使用方便添加一个根据类型获取的 overload

public static LibraryInfo GetLibraryInfo(Type type) => GetLibraryInfo(Guard.NotNull(type).Assembly);

More

使用 dotnet-exec  来测试一下

dotnet-exec 'ApplicationHelper.GetLibraryInfo(typeof(WeihanLi.Npoi.CsvHelper))' --reference "nuget:WeihanLi.Npoi,2.4.2"

从输出结果我们可以看到我们已经拿到 commit hash 和 RepositoryUrl 信息了,对应的 Github commit 地址就是:https://github.com/WeihanLi/WeihanLi.Npoi/tree/8e2c1dee6efee9b7b4b12f16272f266c9ad09233

最后还是建议大家在自己开源类库项目中集成 source link,不仅方便调试,还可以比较方便准确的获取对应版本的 commit 信息,这样别人使用遇到问题的话也会比较方便的进行 debug 和查找源代码

References

  • https://github.com/dotnet/sourcelink

  • https://github.com/WeihanLi/WeihanLi.Common/blob/1.0.58/src/WeihanLi.Common/Helpers/ApplicationHelper.cs

以上是关于C#中,运行程序时提示:无法直接启动还有类库输出类型的项目?的主要内容,如果未能解决你的问题,请参考以下文章

高分!!急!!无法直接启动带有"类库输出类型"的项目

C#调用DLL问题

!!无法直接启动带有"类库输出类型"的项目,求助啊

“无法直接启动输出类型为类库的项目”

在多台机器上开发时无法运行 VSPackage

C#.NET常见问题(FAQ)-无法直接启动带有类库输出类型的项目怎么办