类型初始值设定项引发异常的解决办法

本文详细介绍了在Web.config配置更改后,遇到的SQLite静态变量初始化异常问题及其解决方法,包括如何正确配置数据库连接字符串以及避免TypeInitializationException异常的常见步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在调试代码的时候突然抛出了如下异常:“XORM.Database”的类型初始值设定项引发异常。

顿时感觉很突兀,平常的时候一点问题没有,为什么今天调试就出问题了呢?测试了一下,发现在数据处理层的一条实例化代码处出错:

            //获取类型的映射信息
            MappingInfo mapInfo = xmlMapping.GetDataMapInfo(type);

            Database db = new Database();//出错代码
            db.CommandText = storageprocedure;

            //获取查询条件的映射信息

找了很久没有找到原因,后再网上搜索了下,是因为静态成员初始化异常引起的问题。我的Database类中只有一个静态成员。Database类如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
using System.Configuration;

namespace XORM
{
    internal class Database: IDisposable
    {
        private static string _connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["TestForCSSConn"].ConnectionString;//静态成员
        private IDbConnection _connection = null;
        private string _commandText = null;
        private ArrayList _parameters = new ArrayList();
        private bool _disposed;

        public IDataReader GetDataReader()
        {
            using (IDbCommand cmd = getCommand())
            {
                return cmd.ExecuteReader();
            }
        }

        private ArrayList _inoutParameters = new ArrayList();

        private IDbCommand getCommand()
        {
            IDbCommand cmd = connection.CreateCommand();
            cmd.CommandText = _commandText;
            cmd.CommandType = CommandType.StoredProcedure;
            foreach (SqlParameter parm in _parameters)
            {
                cmd.Parameters.Add(parm);
            }
            //既能输入也能返回的参数
            foreach (SqlParameter parm in _inoutParameters)
            {
                parm.Direction = ParameterDirection.Output;
                cmd.Parameters.Add(parm);
            }

            return cmd;
        }

        public IDbCommand GetCommand()
        {
            return getCommand();
        }

        public string CommandText
        {
            set { _commandText = value; }
            get { return _commandText; }
        }

        private IDbConnection connection
        {
            get 
            {
                if (_connection == null)
                {
                    _connection = new SqlConnection(_connectionString);
                    _connection.Open();
                }
                return _connection;
            }
        }

        public void AddParameters(string name, object obj)
        {
            if (name.StartsWith("@") == false)
            {
                name = "@" + name;
            }
            SqlParameter p = new SqlParameter(name, obj);
            _parameters.Add(p);
        }

        public void AddInOutParameters(string name, object obj)
        {
            if (name.StartsWith("@") == false)
            {
                name = "@" + name;
            }
            SqlParameter p = new SqlParameter(name, obj);
            _inoutParameters.Add(p);
        }

        public ArrayList Parameters
        {
            get { return _parameters; }
        }

        public void Dispose()
        {
            if (_disposed == true)
            {
                return;
            }
            //    Dispose and close the connection
            Close();
            // This object will be cleaned up by the Dispose method.
            // Therefore, you should call GC.SupressFinalize to
            // take this object off the finalization queue
            // and prevent finalization code for this object
            // from executing a second time.
            GC.SuppressFinalize(this);
            _disposed = true;
        }

        public void Close()
        {
            if (_disposed == true)
            {
                return;
            }

            if (_connection != null)
            {
                _connection.Close();
                _connection.Dispose();
            }
        }
    }
}

仔细对比了一下,发现确实是这条语句出了问题,在我的web.config配置文件中数据库连接字符串的没有名为TestForCSSConn的,这是因为今天修改了web.config文件,新的数据库连接字段如下:

 

 <add name="TestForCSS" connectionString="Server=(local);Database=BookExchange;User ID=sa;Password=123;Connection TimeOut=180" 
         providerName="System.Data.SqlClient"/>

 

将此处的name="TestForCSS"修改为name="TestForCSSConn"就可以了。

通过在网上搜索归纳了一下可能的原因:

1. 访问类的某一静态成员,而其他静态成员的初始化(或静态构造函数)中产生异常。例如访问ClassHelper.StaticString,由于静态成员Field的初始化产生异常,因此调用ClassHelper.StaticString会抛出TypeInitializationException。

2. 访问类的某一静态成员,该静态成员的初始化(或静态构造函数)中产生异常。

3. 对该类进行初始化,而类中的某个静态成员初始化(或静态构造函数)中产生异常。

解决办法:

1、检查类中的静态字段或属性,确保其能够正常的完成初始化

2、在类的构造函数中,确保其访问的属性或字段都已经完成初始化

3、如果是WinForm中,将访问的窗体控件的语句写在初始化方法之后

同时,导致错误发生还可能是导入的引用sqlite.dll上,以下是这种情况的解决办法(引用自博友雪庭):

sqlite.dll分32位和 64位,以前用在32位下,开发换到win 7/x64下。在项目属性中,修改目平台,从Any CPU改为x86,重新运行正 常,sqlite.dll是32位的,但目标 平台是x64的,有关sqlite的静态变量初始化异常,引起sqlite类初始化错误,引发 TypeInitializationException异常。

 

转载于:https://www.cnblogs.com/SheepRunning/p/4452847.html

<think>我们正在解决VM.Core.TempVmSolution类型初始值设定项引发异常问题。根据引用内容,异常可能由多种原因引起,我们将逐步排查。首先,根据引用[1]和引用[2],我们需要注意以下几点:1.检查加密狗是否插好,程序是否以管理员权限运行,以及是否取消首选32位勾选(如果适用)。2.确保VM4.0版本为最新(20220415以上),并打上最新补丁(如20220505补丁)。如果打过补丁,需要将补丁目录下的文件替换到二次开发项目的EXE生成路径下。3.结束所有VM相关进程,防止双开。引用[2]补充说明,VM启动时会拉起四个进程,而VMSDK程序启动时会拉起两个进程。因此,我们只需要结束VisionMaster.exe和VisionMasterServerAPP.exe进程即可。可以使用以下代码在程序初始化时结束进程:```csharpKillProcess("VisionMaster");KillProcess("VisionMasterServerApp");//定义KillProcess方法voidKillProcess(stringprocessName){foreach(System.Diagnostics.ProcesspinSystem.Diagnostics.Process.GetProcesses()){if(p.ProcessName==processName){try{p.Kill();p.WaitForExit();}catch(Exceptione){Console.WriteLine(e.Message);}}}}```4.运行环境检测工具(EnvironmentDetectionTool.exe)检查VM安装环境是否正常。5.如果之前打开过多个版本的VM,尝试重启电脑或打开相应版本的VM来拉起服务。6.检查是否严格按照环境配置步骤,使用ImportRef工具添加引用,且每个项目只使用一次该工具。另外,引用[3]提到一个类似异常类型初始值设定项引发异常)的案例,原因是程序集名称不匹配。在反射加载时,配置的程序集名称(MyItem.SQLServerDal)与实际生成的程序集名称(SQLServerDal.dll)不一致。因此,我们需要检查:-项目中引用的程序集名称是否正确,特别是与VM相关的引用。-确保所有依赖项(尤其是VM.Core等关键程序集)的版本与当前使用的VM版本一致,并且已经正确引用。针对VM.Core.TempVmSolution初始化异常,我们还可以采取以下措施:-检查应用程序的配置文件(如App.config或Web.config)中是否有关于VM.Core.TempVmSolution的配置项,并确保配置正确。-查看异常详细信息(堆栈跟踪和内部异常),以确定具体是哪个部分初始化失败。综上所述,请按照以下步骤操作:步骤1:确保环境配置正确-以管理员权限运行程序。-检查加密狗状态。-运行环境检测工具(EnvironmentDetectionTool.exe)确保环境正常。步骤2:更新VM并替换补丁文件-确认VM版本,更新到最新版本并打上最新补丁。-将补丁文件(VisionMaster4.0.0\Development\V4.0.0\ComControls\bin\x64下的所有文件)复制到二次开发项目的输出目录(如Debug或Release文件夹)。步骤3:结束相关进程-在程序初始化前结束VisionMaster和VisionMasterServerApp进程(使用上述代码)。步骤4:检查程序集引用-使用ImportRef工具添加引用,确保引用正确。-检查引用的程序集版本是否一致,特别是VM.Core等核心程序集。-确认项目生成的目标平台(x86或x64)与VM环境匹配(一般用x64)。步骤5:检查配置文件-如果有配置文件,检查与VM相关的配置节是否正确。步骤6:查看异常详细信息-捕获并记录异常详细信息,特别是内部异常,以定位问题根源。如果以上步骤仍不能解决问题,建议重启计算机,并尝试重新安装VM(注意版本一致)。相关问题:1.如何获取VM4.0的最新补丁?2.如何正确使用ImportRef工具添加引用?3.如何配置VM二次开发项目的目标平台?4.如何查看VM相关进程是否正在运行?5.在捕获到VM.Core.TempVmSolution异常时,如何获取详细的错误信息?</think>### VM.Core.TempVmSolution 初始化异常解决方案 针对`VM.Core.TempVmSolution`类型初始值设定项引发异常,结合引用内容,请按以下步骤排查: #### 1. **基础环境检查** [^1] ```csharp // 强制结束冲突进程的代码示例 KillProcess("VisionMaster"); KillProcess("VisionMasterServerApp"); KillProcess("VmModuleProxy"); void KillProcess(string processName) { foreach (var p in Process.GetProcessesByName(processName)) { try { p.Kill(); p.WaitForExit(3000); } catch { /* 记录日志 */ } } } ``` - ✅ 以**管理员权限**运行程序 - ✅ 检查加密狗是否正常连接 - ✅ 在VS项目属性中取消勾选`首选32位`(目标平台选x64) - ✅ 重启计算机清除残留进程 #### 2. **版本与补丁维护** [^1][^2] - 检查VM版本号(需≥20220415) - 安装最新补丁(如20220505补丁) - 补丁文件替换路径: ``` VisionMaster4.0.0\Development\V4.0.0\ComControls\bin\x64 → 复制到项目输出目录(如Debug/Release) ``` #### 3. **程序集引用验证** [^3] ```xml <!-- 检查app.config/web.config配置 --> <add name="TempVmSolution" type="VM.Core.TempVmSolution, MyProduct.VM.Core" /> ``` - 🔍 确认程序集名称一致性: - 项目引用名称 vs 实际DLL文件名 - 配置文件中程序集名称 vs 程序集属性 - 通过**反射加载测试**: ```csharp var assembly = Assembly.Load("MyProduct.VM.Core"); var type = assembly.GetType("VM.Core.TempVmSolution"); ``` #### 4. **环境检测工具诊断** [^1] 运行环境检测工具: ``` VisionMaster4.0.0\Applications\Tools\EnvironmentDetectionTool.exe ``` - 检查.NET Framework版本(需4.7.2+) - 验证VC++运行库是否完整 - 确认显卡驱动兼容性 #### 5. **引用管理规范** [^2] - 使用`ImportRef.exe`工具添加引用 - 单个项目**仅执行一次**引用导入 - 检查引用路径是否包含空格/中文(建议全英文路径) #### 6. **异常信息深度分析** 在初始化代码处捕获详细异常: ```csharp try { var solution = new TempVmSolution(); } catch (TypeInitializationException ex) { // 重点记录内部异常 File.WriteAllText("error.log", $"InnerException: {ex.InnerException?.Message}\n" + $"StackTrace: {ex.InnerException?.StackTrace}"); } ``` ### 典型解决案例 某用户遇到相同异常后: 1. 发现`MyProduct.VM.Core.dll`实际输出为`VM.Core.dll` 2. 修改项目属性→程序集名称→保持与配置文件一致 3. 使用`ImportRef.exe`重新导入引用 4. 问题解决[^3] --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值