You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何获取到的调用程序集是System.Private.CoreLib?

Blazor WebAssembly中区分类库与入口程序集调用的问题解决

在WebAssembly环境开发类库时,若尝试通过常规方法获取调用程序集,常会因为WASM编译/运行时的特殊处理,返回System.Private.CoreLib而非实际的调用方程序集,即便禁用方法内联也无法解决。以下是可行的解决思路:

方法一:解析调用栈获取实际调用程序集

直接捕获调用栈,跳过类库自身及框架程序集的条目,定位到实际调用方:

using System.Diagnostics;

public Assembly? GetRealCallingAssembly()
{
    var stackTrace = new StackTrace();
    foreach (var frame in stackTrace.GetFrames())
    {
        var method = frame.GetMethod();
        if (method == null) continue;
        
        var assembly = method.DeclaringType?.Assembly;
        if (assembly == null) continue;
        
        // 替换为你的类库程序集名称,排除自身和框架库
        if (assembly.FullName.Contains("YourLibraryAssemblyName") || 
            assembly.FullName.Contains("System.Private.CoreLib"))
        {
            continue;
        }
        
        return assembly;
    }
    return Assembly.GetEntryAssembly();
}

方法二:显式传递调用方标识

通过方法参数让调用方主动提供程序集信息,避免依赖反射获取的不确定性:

// 类库中的方法
public void ProcessContent(Assembly? callerAssembly = null)
{
    var targetAssembly = callerAssembly ?? Assembly.GetEntryAssembly();
    // 根据targetAssembly区分类库内部调用与入口程序集调用
}

// 入口程序集调用时传入自身程序集
yourLibraryInstance.ProcessContent(Assembly.GetExecutingAssembly());

// 类库内部调用时无需传参,或传入类库自身程序集
ProcessContent(Assembly.GetExecutingAssembly());

方法三:排查编译修剪配置

Blazor WASM发布模式下的代码修剪可能破坏调用栈或反射信息,可临时禁用修剪排查:

<!-- 在类库或入口项目的.csproj中添加 -->
<PropertyGroup>
    <PublishTrimmed>false</PublishTrimmed>
</PropertyGroup>

注意:正式发布时需评估修剪对体积的影响,谨慎调整。

内容的提问来源于stack exchange,提问作者ZorgoZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 01:27:21