Я использую VS2008. У меня есть проект, SystemSoftware
проект, подключитесь к базе данных, и мы используем L2E
. У меня есть класс RuntimeInfo
, который содержит некоторую общую информацию. Это выглядит следующим образом:C#, не могу понять эту ошибку?
public class RuntimeInfo
{
public const int PWD_ExpireDays = 30;
private static RuntimeInfo thisObj = new RuntimeInfo();
public static string AndeDBConnStr = ConfigurationManager.ConnectionStrings["AndeDBEntities"].ConnectionString;
private RuntimeInfo() {
}
/// <summary>
///
/// </summary>
/// <returns>Return this singleton object</returns>
public static RuntimeInfo getRuntimeInfo()
{
return thisObj;
}
}
Теперь я добавил помощник проект, AndeDataViewer
, к решению, которое создает простой интерфейс для отображения данных из базы данных для тестирования/проверка цели.
Я не хочу создавать другой набор Entity Data Model
в вспомогательном проекте. Я просто добавил все связанные файлы в качестве ссылки в новом проекте-помощнике.
В проекте AndeDataViewer
, я получаю connection string
сверху RuntimeInfo
класса, который является классом от моего SystemSoftware
проекта в качестве связанного файла. Код в AndeDataViewer
, как это:
public class DbAccess : IDisposable
{
private String connStr = String.Empty;
public DbAccess()
{
connStr = RuntimeInfo.AndeDBConnStr;
}
}
Мои SystemSoftware
работает отлично это означает, что RuntimeInfo
класс не имеет никаких проблем там. Но когда я бегу мой AndeDataViewer
, оператор внутри выше конструктора,
connStr = RuntimeInfo.AndeDBConnStr;
, бросает исключение. Исключение копируется здесь:
System.TypeInitializationException was unhandled
Message="The type initializer for 'MyCompany.SystemSoftware.SystemInfo.RuntimeInfo' threw an exception."
Source="AndeDataViewer"
TypeName="MyCompany.SystemSoftware.SystemInfo.RuntimeInfo"
StackTrace:
at AndeDataViewer.DbAccess..ctor() in C:\workspace\SystemSoftware\Other\AndeDataViewer\AndeDataViewer\DbAccess.cs:line 17
at AndeDataViewer.Window1.rbRawData_Checked(Object sender, RoutedEventArgs e) in C:\workspace\SystemSoftware\Other\AndeDataViewer\AndeDataViewer\Window1.xaml.cs:line 69
at System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
....
InnerException: System.NullReferenceException
Message="Object reference not set to an instance of an object."
Source="AndeDataViewer"
StackTrace:
at MyCompany.SystemSoftware.SystemInfo.RuntimeInfo..cctor() in C:\workspace\SystemSoftware\SystemSoftware\src\systeminfo\RuntimeInfo.cs:line 24
InnerException:
Я не могу понять это, потому что это выглядит хорошо для меня, но почему существует исключение? мы не можем получить доступ к статической переменной, если класс является связанным классом? Связанный класс должен быть таким же, как местный класс, я думаю. «Связанный» здесь означает, что когда я добавляю файл, я использую «Добавить как ссылку».
как я могу избежать этого исключения?
EDIT:
Я добавил файл App.config SystemSoftware в AndeDataViewer как ссылку. Затем исправил эту проблему, но мне это не нравится. Как насчет того, есть ли у меня App.config? Я не хочу вручную копировать строку соединения там, потому что «вручную» означает «нет».
для тех, кто имеет несколько проектов имеют одну базу данных, эта ссылка может быть helperful, когда у вас есть проблемы: MetadataException: Unable to load the specified metadata resource
Какой тип данных «ConfigurationManager.ConnectionStrings»? Я предполагаю 'Dictionary', но зачем вам нужно извлекать из него ConnectionString? –
Powerlord
Что касается зависимостей, вы можете заставить 'AndeDataViewer' иметь' SystemSoftware' в качестве зависимости, а затем обращаться к своим объектам через пространство имен SystemSoftware, хотя вам также необходимо сделать публичную публикацию 'RuntimeInfo'. – Powerlord