我为我创建的应用程序创建了一个DLL。 但是当我将DLL作为参考添加到控制台应用程序但是不知道这意味着这是错误时,我收到了错误:
未处理的类型' System.TypeInitializationException'发生在ConsoleApplication1.exe
中这是我的dll课程:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
namespace Steap
{
public class SteapAPI
{
public static String URL
{
get;
set;
}
public static XmlReader r = XmlReader.Create(URL + "?xml=1&l=english");
public int getSteamID64()
{
int ID = 0;
r.ReadToFollowing("steamID64");
ID = r.ReadContentAsInt();
return ID;
}
public string getSteamID()
{
string ID = String.Empty;
r.ReadToFollowing("steamID");
ID = r.ReadContentAsString();
return ID;
}
public int getVac()
{
int Vac = 0;
r.ReadToFollowing("vacBanned");
Vac = r.ReadContentAsInt();
return Vac;
}
public bool hasVac()
{
if (getVac() == 0)
{
return false;
}
else
{
return true;
}
}
// =================== [ Aliases
public string getName()
{
return getSteamID();
}
}
}
控制台应用程序代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Steap;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
SteapAPI sapi = new SteapAPI(); // TypeInitializationException was unhandled error here
SteapAPI.URL = "http://steamcommunity.com/id/bluesephire";
Console.ReadKey();
}
}
}
有什么问题或缺少什么
答案 0 :(得分:3)
在类的静态字段初始化期间,您会遇到异常,导致无法加载类,从而导致TypeInitializationException
异常。
特殊线:
public static XmlReader r = XmlReader.Create(URL + "?xml=1&l=english");
URL
在调用的时间方法中未初始化(即使它具有静态值,如URL=@"c:\file.txt"
,也无法保证首先初始化一个字段。
从那时起,请注意,SteapAPI
类的任何访问都会抛出TypeInitializationException
,即使它没有触及直接涉及原始异常的字段。
答案 1 :(得分:1)
在这种情况下,您不应该使用静态字段。如果您创建了两个SteapAPI
对象,静态字段将导致巨大的问题,因为当您设置一个URL时,它将覆盖另一个,并且您永远无法重新初始化XmlReader
以下是如何将API类重写为完整的实例类:
namespace Steap
{
public class SteapAPI
{
public String URL
{
get;
set;
}
public XmlReader r;
public SteapAPI(string url)
{
URL = url;
//NOTE: This is wrong! You can't create an XmlReader with a URL
//and expect it to fetch a web resource.
r = XmlReader.Create(URL + "?xml=1&l=english");
}
public int getSteamID64()
{
int ID = 0;
r.ReadToFollowing("steamID64");
ID = r.ReadContentAsInt();
return ID;
}
public string getSteamID()
{
string ID = String.Empty;
r.ReadToFollowing("steamID");
ID = r.ReadContentAsString();
return ID;
}
public int getVac()
{
int Vac = 0;
r.ReadToFollowing("vacBanned");
Vac = r.ReadContentAsInt();
return Vac;
}
public bool hasVac()
{
if (getVac() == 0)
{
return false;
}
else
{
return true;
}
}
// =================== [ Aliases
public string getName()
{
return getSteamID();
}
}
然后在你的程序中使用它:
class Program
{
static void Main(string[] args)
{
SteapAPI sapi = new SteapAPI("http://steamcommunity.com/id/bluesephire");
Console.ReadKey();
}
}
它是一个微小的变化,但好处是巨大的,你应该学习更多关于使用构造函数和静态字段/属性的缺点,因为它适用于多个实例。请记住,非静态类的静态字段/属性是在类的所有“实例”之间共享,因此设置一个会将该类的所有“实例”设置为新值。这在执行I / O操作和文件/资源读/写时尤为重要。