为何获取到的调用程序集是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
相关产品推荐
相关产品推荐

