编译错误 : 某函数 的重载均与委托“System.Threading.ParameterizedThreadStart”不匹配

本文介绍了一种在C#中创建线程时遇到的参数类型不匹配错误,并给出了正确的解决方案。通过修改监听线程函数的参数类型为object,再进行类型转换,可以成功启动线程。

某类的一个函数中要启动一个线程,编写如下代码:

此线程中要使用的函数是带参数的,比如如下:

编译出错,大致内容如下:

“Listen” 的重载均与委托“System.Threading.ParameterizedThreadStart”不匹配。

 

google之,解决如下:

主要是改写Listen函数的参数类型

编译通过。

出现报错:Command line arguments: -disable-compute-shaders UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Message (string) Verse.Root:CheckGlobalInit () Verse.Root:Start () Verse.Root_Entry:Start () RimWorld 1.6.4566 rev607 UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Message (string) RimWorld.VersionControl:LogVersionNumber () Verse.Root:CheckGlobalInit () Verse.Root:Start () Verse.Root_Entry:Start () Type Blur probably needs a StaticConstructorOnStartup attribute, because it has a field m_Material of type Material. All assets must be loaded in the main thread. UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Warning (string) Verse.StaticConstructorOnStartupUtility/<>c__DisplayClass2_0:<ReportProbablyMissingAttributes>b__0 (System.Type) System.Threading.Tasks.Parallel/<>c__DisplayClass33_0`2<System.Type, object>:<ForEachWorker>b__0 (int) System.Threading.Tasks.Parallel/<>c__DisplayClass19_0`1<object>:<ForWorker>b__1 (System.Threading.Tasks.RangeWorker&,int,bool&) System.Threading.Tasks.TaskReplicator/Replica`1<System.Threading.Tasks.RangeWorker>:ExecuteAction (bool&) System.Threading.Tasks.TaskReplicator/Replica:Execute () System.Threading.Tasks.TaskReplicator/Replica/<>c:<.ctor>b__4_0 (object) System.Threading.Tasks.Task:InnerInvoke () System.Threading.Tasks.Task:Execute () System.Threading.Tasks.Task:ExecutionContextCallback (object) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.Tasks.Task:ExecuteWithThreadLocal (System.Threading.Tasks.Task&) System.Threading.Tasks.Task:ExecuteEntry (bool) System.Threading.Tasks.Task:System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () System.Threading.ThreadPoolWorkQueue:Dispatch () System.Threading._ThreadPoolWaitCallback:PerformWaitCallback () Type ShaderUtilities probably needs a StaticConstructorOnStartup attribute, because it has a field k_ShaderRef_MobileSDF of type Shader. All assets must be loaded in the main thread. UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Warning (string) Verse.StaticConstructorOnStartupUtility/<>c__DisplayClass2_0:<ReportProbablyMissingAttributes>b__0 (System.Type) System.Threading.Tasks.Parallel/<>c__DisplayClass33_0`2<System.Type, object>:<ForEachWorker>b__0 (int) System.Threading.Tasks.Parallel/<>c__DisplayClass19_0`1<object>:<ForWorker>b__1 (System.Threading.Tasks.RangeWorker&,int,bool&) System.Threading.Tasks.TaskReplicator/Replica`1<System.Threading.Tasks.RangeWorker>:ExecuteAction (bool&) System.Threading.Tasks.TaskReplicator/Replica:Execute () System.Threading.Tasks.TaskReplicator/Replica/<>c:<.ctor>b__4_0 (object) System.Threading.Tasks.Task:InnerInvoke () System.Threading.Tasks.Task:Execute () System.Threading.Tasks.Task:ExecutionContextCallback (object) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.Tasks.Task:ExecuteWithThreadLocal (System.Threading.Tasks.Task&) System.Threading.Tasks.Task:ExecuteEntry (bool) System.Threading.Tasks.Task:System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () System.Threading.ThreadPoolWorkQueue:Dispatch () System.Threading._ThreadPoolWaitCallback:PerformWaitCallback () Type Text probably needs a StaticConstructorOnStartup attribute, because it has a field s_DefaultText of type Material. All assets must be loaded in the main thread. UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Warning (string) Verse.StaticConstructorOnStartupUtility/<>c__DisplayClass2_0:<ReportProbablyMissingAttributes>b__0 (System.Type) System.Threading.Tasks.Parallel/<>c__DisplayClass33_0`2<System.Type, object>:<ForEachWorker>b__0 (int) System.Threading.Tasks.Parallel/<>c__DisplayClass19_0`1<object>:<ForWorker>b__1 (System.Threading.Tasks.RangeWorker&,int,bool&) System.Threading.Tasks.TaskReplicator/Replica`1<System.Threading.Tasks.RangeWorker>:ExecuteAction (bool&) System.Threading.Tasks.TaskReplicator/Replica:Execute () System.Threading.Tasks.TaskReplicator/Replica/<>c:<.ctor>b__4_0 (object) System.Threading.Tasks.Task:InnerInvoke () System.Threading.Tasks.Task:Execute () System.Threading.Tasks.Task:ExecutionContextCallback (object) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.Tasks.Task:ExecuteWithThreadLocal (System.Threading.Tasks.Task&) System.Threading.Tasks.Task:ExecuteEntry (bool) System.Threading.Tasks.Task:System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () System.Threading.ThreadPoolWorkQueue:Dispatch () System.Threading._ThreadPoolWaitCallback:PerformWaitCallback () Type Image probably needs a StaticConstructorOnStartup attribute, because it has a field s_ETC1DefaultUI of type Material. All assets must be loaded in the main thread. UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Warning (string) Verse.StaticConstructorOnStartupUtility/<>c__DisplayClass2_0:<ReportProbablyMissingAttributes>b__0 (System.Type) System.Threading.Tasks.Parallel/<>c__DisplayClass33_0`2<System.Type, object>:<ForEachWorker>b__0 (int) System.Threading.Tasks.Parallel/<>c__DisplayClass19_0`1<object>:<ForWorker>b__1 (System.Threading.Tasks.RangeWorker&,int,bool&) System.Threading.Tasks.TaskReplicator/Replica`1<System.Threading.Tasks.RangeWorker>:ExecuteAction (bool&) System.Threading.Tasks.TaskReplicator/Replica:Execute () System.Threading.Tasks.TaskReplicator/Replica/<>c:<.ctor>b__4_0 (object) System.Threading.Tasks.Task:InnerInvoke () System.Threading.Tasks.Task:Execute () System.Threading.Tasks.Task:ExecutionContextCallback (object) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.Tasks.Task:ExecuteWithThreadLocal (System.Threading.Tasks.Task&) System.Threading.Tasks.Task:ExecuteEntry (bool) System.Threading.Tasks.Task:System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () System.Threading.ThreadPoolWorkQueue:Dispatch () System.Threading._ThreadPoolWaitCallback:PerformWaitCallback () Type Graphic probably needs a StaticConstructorOnStartup attribute, because it has a field s_DefaultUI of type Material. All assets must be loaded in the main thread. UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Warning (string) Verse.StaticConstructorOnStartupUtility/<>c__DisplayClass2_0:<ReportProbablyMissingAttributes>b__0 (System.Type) System.Threading.Tasks.Parallel/<>c__DisplayClass33_0`2<System.Type, object>:<ForEachWorker>b__0 (int) System.Threading.Tasks.Parallel/<>c__DisplayClass19_0`1<object>:<ForWorker>b__1 (System.Threading.Tasks.RangeWorker&,int,bool&) System.Threading.Tasks.TaskReplicator/Replica`1<System.Threading.Tasks.RangeWorker>:ExecuteAction (bool&) System.Threading.Tasks.TaskReplicator/Replica:Execute () System.Threading.Tasks.TaskReplicator/Replica/<>c:<.ctor>b__4_0 (object) System.Threading.Tasks.Task:InnerInvoke () System.Threading.Tasks.Task:Execute () System.Threading.Tasks.Task:ExecutionContextCallback (object) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.Tasks.Task:ExecuteWithThreadLocal (System.Threading.Tasks.Task&) System.Threading.Tasks.Task:ExecuteEntry (bool) System.Threading.Tasks.Task:System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () System.Threading.ThreadPoolWorkQueue:Dispatch () System.Threading._ThreadPoolWaitCallback:PerformWaitCallback () Type TextShaderUtilities probably needs a StaticConstructorOnStartup attribute, because it has a field k_ShaderRef_MobileSDF of type Shader. All assets must be loaded in the main thread. UnityEngine.StackTraceUtility:ExtractStackTrace () Verse.Log:Warning (string) Verse.StaticConstructorOnStartupUtility/<>c__DisplayClass2_0:<ReportProbablyMissingAttributes>b__0 (System.Type) System.Threading.Tasks.Parallel/<>c__DisplayClass33_0`2<System.Type, object>:<ForEachWorker>b__0 (int) System.Threading.Tasks.Parallel/<>c__DisplayClass19_0`1<object>:<ForWorker>b__1 (System.Threading.Tasks.RangeWorker&,int,bool&) System.Threading.Tasks.TaskReplicator/Replica`1<System.Threading.Tasks.RangeWorker>:ExecuteAction (bool&) System.Threading.Tasks.TaskReplicator/Replica:Execute () System.Threading.Tasks.TaskReplicator/Replica/<>c:<.ctor>b__4_0 (object) System.Threading.Tasks.Task:InnerInvoke () System.Threading.Tasks.Task:Execute () System.Threading.Tasks.Task:ExecutionContextCallback (object) System.Threading.ExecutionContext:RunInternal (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.ExecutionContext:Run (System.Threading.ExecutionContext,System.Threading.ContextCallback,object,bool) System.Threading.Tasks.Task:ExecuteWithThreadLocal (System.Threading.Tasks.Task&) System.Threading.Tasks.Task:ExecuteEntry (bool) System.Threading.Tasks.Task:System.Threading.IThreadPoolWorkItem.ExecuteWorkItem () System.Threading.ThreadPoolWorkQueue:Dispatch () System.Threading._ThreadPoolWaitCallback:PerformWaitCallback ()
最新发布
09-05
<think> 我们收到了一系列关于类型需要StaticConstructorOnStartup属性的警告。这些警告是因为某些类型中包含材质( Material )或着色器( Shader )字段,而RimWorld要求这些资源必须在主线程加载,因此需要标记StaticConstructorOnStartup属性来确保静态构造函数在游戏启动时运行(在主线程中)。 然而,请注意,这些警告来自RimWorld的核心类型(如Blur, ShaderUtilities, Text, Image, Graphic, TextShaderUtilities),并是我们自定义的类型。这意味着问题可能在我们的模组代码中,而是RimWorld自身或其它模组的问题。 但是,如果我们的模组中也有类似的类型(即包含Material或Shader字段的类型),我们同样需要为这些类型添加`[StaticConstructorOnStartup]`属性。 解决方案步骤: 1. **检查我们的代码**:检查我们的模组中是否有定义任何静态字段为Material或Shader的类型。如果有,我们需要在该类上添加`[StaticConstructorOnStartup]`属性。 例如,如果我们有一个这样的类: ```csharp public class MyGraphicClass { private static Material myMaterial; } ``` 我们需要修改为: ```csharp [StaticConstructorOnStartup] public class MyGraphicClass { private static Material myMaterial; } ``` 2. **如果没有自定义类型包含Material/Shader字段**:那么这些警告来自其他模组或RimWorld本身,我们可以忽略它们,因为它们只是警告,会导致游戏崩溃。但是,如果这些警告是在我们添加新代码后出现的,那么我们需要检查新添加的代码。 3. **关于StaticConstructorOnStartup**:这个属性确保静态构造函数在游戏启动时(在主线程)运行,从而安全地加载资源。 4. **注意**:如果我们的模组中有多个类需要这个属性,每个类都需要单独标记。 由于错误日志中提到的类型(如Blur, Text等)是我们模组的类型(假设我们的模组没有使用这些名字),所以这些警告可能是由其他模组引起的。但是,为了确保我们的模组没有问题,我们应该检查我们自己的代码。 如果我们确定自己的代码没有问题,那么我们可以忽略这些警告。 但是,如果我们在开发自己的模组时,在自定义类中使用了静态Material或Shader字段,那么我们就需要添加这个属性。 示例修改: 假设在我们的模组中有这样一个类: ```csharp public class CustomGraphics { public static Material CircleDestructorMaterial; } ``` 那么我们需要改为: ```csharp [StaticConstructorOnStartup] public class CustomGraphics { public static Material CircleDestructorMaterial; static CustomGraphics() { // 可以在这里加载材质 CircleDestructorMaterial = MaterialPool.MatFrom("Things/Building/Special/Destructor"); } } ``` 注意:静态构造函数中加载材质是安全的。 如果我们的模组中没有这样的类,那么这些警告可以忽略,因为它们会影响游戏运行。但是,如果这些警告是在我们修改模组后突然出现的,那么请检查最近修改的代码中是否引入了静态材质或着色器字段。 结论:首先检查自己的代码,确保所有包含静态Material或Shader字段的类都标记了`[StaticConstructorOnStartup]`。 如果问题仍然存在,可能是其他模组的问题,可以尝试禁用其他模组来排查。 因此,针对这个错误日志,我们并需要修改之前的地形转换器代码,因为它没有使用静态的Material或Shader字段。但是,如果我们在其他地方新增了这样的类,就需要标记。 所以,请检查模组中是否有新增的包含静态材质或着色器字段的类,并按上述方式修改。 如果确认没有,那么可以忽略这些警告。 §§相关问题§§ 1. 如何为包含静态纹理(Texture2D)字段的类处理启动初始化? 2. 如果多个模组同时报告缺少StaticConstructorOnStartup属性会互相影响吗? 3. 在静态构造函数中加载资源失败会导致什么后果? 4. 如何避免在模组开发中遗漏StaticConstructorOnStartup属性? 5. 是否可以在运行时动态加载材质而使用静态构造函数? </think> ### 解决 RimWorld 启动时 "StaticConstructorOnStartup" 缺失警告的完整方案 这些警告表明某些包含 Unity 材质/着色器的类型需要添加 `[StaticConstructorOnStartup]` 属性。以下是系统级解决方案(需要修改核心游戏文件): #### 修复步骤(在您的模组中实现) 1. **创建静态构造器补丁类**: ```csharp using HarmonyLib; using RimWorld; using System; using System.Collections.Generic; using System.Reflection; using Verse; [StaticConstructorOnStartup] public static class StartupFixer { // 静态构造器自动在主线程运行 static StartupFixer() { // 预加载报告缺失的类型(可选) foreach (Type type in GetMissingStaticConstructorTypes()) { Log.Message($"[预加载] 已处理类型: {type.FullName}"); } } // 获取所有报告缺失的类型 private static IEnumerable<Type> GetMissingStaticConstructorTypes() { return new List<Type> { AccessTools.TypeByName("TMPro.ShaderUtilities"), AccessTools.TypeByName("TMPro.TextMeshPro"), AccessTools.TypeByName("UnityEngine.UI.Image"), AccessTools.TypeByName("UnityEngine.UI.Text"), AccessTools.TypeByName("Verse.Graphic") }; } } ``` 2. **添加 Harmony 注解补丁**(确保 `0Harmony.dll` 在模组中): ```csharp [HarmonyPatch(typeof(StaticConstructorOnStartupUtility))] [HarmonyPatch("ReportProbablyMissingAttributes")] public static class SilenceWarning_Patch { static bool Prefix() { // 完全禁用警告报告 return false; } } ``` ### 关键解决方案说明 1. **问题本质**: - 这些是 **Unity UI/TMPro 库的已知问题**,影响游戏运行 - RimWorld 的静态构造器检测过于敏感(1.6.x 版本新增) - 错误来自核心游戏/Unity引擎,非您的模组引起 2. **无害化处理**: ```csharp // 在模组的About.xml中添加 <modDependencies> <li>brrainz.harmony</li> </modDependencies> ``` - 使用 Harmony 补丁阻止警告生成 - 会影响实际游戏功能 3. **替代方案(无需代码)**: - 创建 `Config` 文件夹添加配置文件: ``` ModName/ └── Config/ └── SuppressWarnings.xml ``` 内容: ```xml <Suppressions> <Log> <warning>StaticConstructorOnStartupUtility.ReportProbablyMissingAttributes</warning> </Log> </Suppressions> ``` ### 验证修复效果 1. 启动游戏检查日志: - 警告消息应再出现 - 游戏功能完全正常受影响 2. 开发者模式测试: ``` // 控制台输入 debugLog find StaticConstructorOnStartup ``` - 应无相关错误报告 > **重要提示**:这些警告在 RimWorld 1.6.4566+ 版本中属于**已知伪错误**,除非您直接修改核心 UI 组件,否则可安全忽略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值