Jawad Ahmed Tanoli Ответов: 7

предпринята попытка чтения защищенной от записи памяти. это часто указывает на то, что другая память повреждена


Привет я разработал настольное приложение с помощью
vs 2008 язык c#
sql server compact 3.5

у меня есть импорт всех необходимых dll

System.Data.SqlServerCe.dll
sqlceca35.dll
sqlcecompact35.dll
sqlceer35EN.dll
sqlceme35.dll
sqlceoledb35.dll
sqlceqp35.dll
sqlcese35.dll

и разверните его, пока он работает без каких-либо ошибок на этом ПК, когда я установлю программу установки на клиентской машине, она будет точно вставлять данные в database.sdf, а также извлекать данные для автозаполнения.
когда я хочу получить данные из него, чтобы заполнить поле со списком или сетку
он будет генерировать ошибку "попытка чтения защищенной от записи памяти. это часто указывает на то, что другая память повреждена"

Примечание:если я установлю эту установку на какой-нибудь другой компьютер с vs2008, она будет работать нормально без каких-либо ошибок...Придется ли мне устанавливать что-то еще и на клиентский компьютер?

я тоже стараюсь строить
в VS2008:

Инструменты->опции

Отладка->Общие сведения

снимите флажок "подавить оптимизацию JIT при загрузке модуля"

но результат будет тот же.


если у кого-то есть какие-то идеи, почему это происходит и как справиться с ситуацией
заранее спасибо...

дополнительная информация скопирована из комментария ниже
//Here is a class that i used for store and retrive data from db
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlServerCe;
using System.Data;
using System.Windows.Forms;
using System.IO;
namespace SalePurchase
{
    class dataBase
    {
       
        private SqlCeDataAdapter ad;
        private SqlCeCommand cmd;
       
        private string StringdbFileName=("Data Source=" + System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase) + "\\sp.sdf").Replace(@"file:\", "");
        private SqlCeConnection coon;
        public dataBase()
        {
             
            
            coon = new SqlCeConnection(StringdbFileName);
            
            coon.Close();
        
         }
//This method is for insertion work fine
        public int ExecuteSQL(string Query)
        {
            try
            {
		coon.Open();
                cmd = new SqlCeCommand();
                cmd.Connection = this.coon;
                cmd.CommandText = Query;
                return cmd.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                coon.Close();

            }

        }
//This method is for Fill DatGrid and Auto complete but it only works for AutoComplete not for DataGrid
        public DataTable GetDataTable(string Query)
        {
            try
            {

                //if (coon.State == ConnectionState.Closed)
                //{
                //    coon.Open();
                //}
                coon.Open();
                DataTable dt = new DataTable();
                cmd = new SqlCeCommand();
                cmd.CommandText = Query;
                ad = new SqlCeDataAdapter(Query,coon);
                ad.Fill(dt);

                return dt;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                coon.Close();

            }

        }
       // this metthod is for FillComboBox
        public void FillComboBox(string Query, string DisplayMember,string ValueMember, ComboBox cmb)
        {
            try
            {
                coon.Open();

                DataTable dt = new DataTable();
                cmd = new SqlCeCommand();
                cmd.CommandText = Query;
                ad = new SqlCeDataAdapter(Query, coon);
                ad.Fill(dt);

                cmb.DataSource = dt;
                cmb.DisplayMember = DisplayMember;
                cmb.ValueMember = ValueMember;

            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                coon.Close();

            }
        }
    }
}

V.Lorz

Вы используете только компоненты .net framework? Вызываете ли вы неуправляемые функции из своего управляемого кода?

Попробуйте изолировать код, который вызывает ошибку, и опубликовать его здесь.

Jawad Ahmed Tanoli

//Вот класс, который я использовал для хранения и извлечения данных из БД
использование системы;
использование системы.Коллекции.Общий;
использование System.Linq;
использование System.Text;
использование System.Data.SqlServerCe;
использование System.Data;
использование системы.Окна.Формы;
использование системы.ИО;
пространство имен SalePurchase
{
база данных классов
{

частное объявление SqlCeDataAdapter;
private SqlCeCommand cmd;

частная строка StringdbFileName=("источник данных=" + System.IO.Path.GetDirectoryName(System.Отражение.Собрание.GetExecutingAssembly().Метод getname().Кода) + "\\СП.СДФ").Заменить(@"файл:\", "");
частный SqlCeConnection coon;
общественная база данных()
{


coon = new SqlCeConnection(StringdbFileName);

енот.Закрывать();

}
public int ExecuteSQL(строковый запрос)
{
пробовать
{
енот.Открыть();
cmd = новая команда SqlCeCommand();
УМК.Соединение = this.coon;
УМК.CommandText = Запрос;
верните cmd.Метод executenonquery();

}
поймать (исключение бывший)
{
бросок экс;
}
наконец
{
енот.Закрывать();

}

}
public DataTable GetDataTable(строковый запрос)
{
пробовать
{

//если (енот.Состояние == ConnectionState.Закрытый)
//{
// енот.Открыть();
//}
енот.Открыть();
DataTable dt = новый DataTable();
cmd = новая команда SqlCeCommand();
УМК.CommandText = Запрос;
ad = новый SqlCeDataAdapter(запрос,coon);
объявление.Заполнить(ДТ);

возврат dt;

}
поймать (исключение бывший)
{
бросок экс;
}
наконец
{
енот.Закрывать();

}

}

общественного недействительными FillComboBox(строку запроса, строку DisplayMember,ValueMember строка, выпадающий список УМК)
{
пробовать
{
енот.Открыть();

DataTable dt = новый DataTable();
cmd = новая команда SqlCeCommand();
УМК.CommandText = Запрос;
ad = новый SqlCeDataAdapter(запрос, coon);
объявление.Заполнить(ДТ);

УМК.Источник данных = ДТ;
cmb.DisplayMember = DisplayMember;
cmb.ValueMember = ValueMember;

}
поймать (исключение бывший)
{
бросок экс;
}
наконец
{
енот.Закрывать();

}
}
}
}

phil.o

Пожалуйста изолировать код, который выдает ошибку, а не дает нам огромный кусок кода.

Jawad Ahmed Tanoli

это та часть, которая генерирует ошибку, которую я использую для отображения данных.
public DataTable GetDataTable(строковый запрос)
{
пробовать
{
енот.Открыть();
DataTable dt = новый DataTable();
cmd = новая команда SqlCeCommand();
УМК.CommandText = Запрос;
ad = новый SqlCeDataAdapter(запрос,coon);
объявление.Заполнить(ДТ);

возврат dt;

}
поймать (исключение бывший)
{
бросок экс;
}
наконец
{
енот.Закрывать();

}

}

Jawad Ahmed Tanoli

DataTable GetDataTable(строковый запрос)
я также использовал этот метод для заполнения autocompletecollectionstring, он также отлично работает там.
но он не будет работать для отображения данных в combobox datagrid...
каждая вещь работает нормально на моем компьютере также я запускаю программу установки на ПК нет никакой ошибки, когда я пытаюсь сделать это на клиентском компьютере он производит ошибку только вставки и autocompletecollectionstring работает там.
я пробую его на некоторых других компьютерах, результат тот же...

V.Lorz

Я заблудился, извините. Работает это или нет?
Где этот код создает исключение? В призыве к объявлению.Может быть, заполнить(dt)? Можете ли вы отладить код на компьютере, который показывает ошибку?

Попробуйте установить Visual Studio RemoteDebugger на ПК, который воспроизводит ошибку, чтобы вы могли войти в код. Вы можете скачать его непосредственно с сайта msdn или установить с вашего установочного компакт-диска visual studio, он используется, чтобы прийти туда (и несколько раз он копируется на ваш жесткий диск при установке).

Для отладки сборок у вас нет исходного кода Вы можете использовать .Net Reflector (http://www.red-gate.com/products/dotnet-development/reflector/). Это уже не бесплатно, но у них есть пробная версия, которую вы можете попробовать.

Jawad Ahmed Tanoli

нет, это не работает.
самое странное, что когда я устанавливаю эту установку на какой-то другой компьютер просто есть vs 2008, он не генерирует никаких ошибок, работает нормально.Есть ли что-то, что я должен установить на ПК?
но когда я устанавливаю его на клиентский ПК, который имеет только .netframework3.5, он только выполняет вставку и извлекает данные из того же самого этого метода для заполнения автозаполнения, но он не будет работать для comboboxes и datagrid.
я застрял там, не имея ни малейшего представления, вызываю ли я ненормированные функции из поврежденного кода, тогда он должен генерировать eroor, когда я отлаживаю ...
хорошо, теперь я пытаюсь использовать Visual Studio RemoteDebugger на клиентском ПК и посмотреть, что произойдет..

Jawad Ahmed Tanoli

----------------------------------------
Система.Операции
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.4927 (NetFXspW7.050727-4900)
Код: файл:///с:/Windows и сборки/GAC_32/системы.Транзакции/2.0.0.0__b77a5c561934e089/система.Transactions.dll
----------------------------------------
System.Xml
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Кодовая база: file:///C:/Windows/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
Система.Конфигурация
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Код: файл:///с:/Windows и сборки/GAC_MSIL/системы.Конфигурация/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
Система.EnterpriseServices
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Код: файл:///с:/Windows и сборки/GAC_32/системы.EnterpriseServices/2.0.0.0__b03f5f7f11d50a3a/System.EnterpriseServices.dll
----------------------------------------

************** Отладка JIT **************
Для включения "точно в срок" (JIT) отладки, на .конфигурационный файл для этой
приложение или компьютер (machine.config) должны иметь
значение jitDebugging задается в разделе system.windows.forms.
Приложение также должно быть скомпилировано с отладкой
включен.

Например:

<конфигурация>
<system.windows.forms jitdebugging="true">


Когда включена отладка JIT, любое необработанное исключение
будет отправлен в JIT-отладчик, зарегистрированный на компьютере
вместо того, чтобы быть обработанным этим диалоговым окном.

Jawad Ahmed Tanoli

Дополнительные сведения о вызове см. В конце этого сообщения
отладка just-in-time (JIT) вместо этого диалогового окна.

************** Текст Исключения **************
Система.AccessViolationException: попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена.
в System.Data.SqlServerCe.NativeMethods.GetKeyInfo(указателя IntPtr видеорегистратор PTX, строки pwszBaseTable, prgDbKeyInfo указателя IntPtr, int32 отсчитываемый cDbKeyInfo, указателя IntPtr pError)
в System.Data.SqlServerCe.SqlCeDataReader.FillMetaData(команда SqlCeCommand)
в System.Data.SqlServerCe.SqlCeCommand.InitializeDataReader(SqlCeDataReader читатель, параметром resulttype, имеющим значение типа int32)
в System.Data.SqlServerCe.SqlCeCommand.ExecuteCommand(CommandBehavior behavior, String method, ResultSetOptions options)
в System.Data.SqlServerCe.SqlCeCommand.ExecuteReader(CommandBehavior поведение)
в System.Data.SqlServerCe.SqlCeCommand.ExecuteDbDataReader(CommandBehavior поведение)
в System.Data.Общий.Объектов dbcommand.Система.Данные.IDbCommand.ExecuteReader(CommandBehavior поведение)
в System.Data.Общий.DbDataAdapter.FillInternal(набора данных набор данных объект DataTable[] объекты DataTable, startRecord типа int32, int32 отсчитываемый maxRecords, строки srcTable, команда IDbCommand, метода commandbehavior поведения)
в System.Data.Общий.DbDataAdapter.Заполнить(объект DataTable[] объекты DataTable, startRecord типа int32, int32 отсчитываемый maxRecords, команда IDbCommand, метода commandbehavior поведения)
в System.Data.Общий.DbDataAdapter.Fill(DataTable dataTable)
at SalePurchase.dataBase.GetDataTable(строковый запрос)
на распродаже.PurchaserEdit.обработчика button1_click(объект отправителя, EventArgs в электронной)
в системе.Окна.Формы.Контроль.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnClick(EventArgs e)
в системе.Окна.Формы.Кнопка.OnMouseUp(MouseEventArgs mevent)
в системе.Окна.Формы.Контроль.WmMouseUp(Message& m, кнопка MouseButtons, Int32 клика)
в системе.Окна.Формы.Контроль.WndProc(сообщение& m)
в системе.Окна.Формы.ButtonBase.WndProc(сообщение& m)
в системе.Окна.Формы.Кнопка.WndProc(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.OnMessage(сообщение& m)
в системе.Окна.Формы.Контроль.ControlNativeWindow.WndProc(сообщение& m)
в системе.Окна.Формы.Родное окно.Обратного вызова(hwnd элемента указателя IntPtr, int32 и глутамат натрия, указателя IntPtr параметр wparam, указателя IntPtr lparam должен)


************** Загруженные Сборки **************
mscorlib
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Кодовая база: file:///C:/Windows/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
SalePurchase
Версия Сборки: 1.0.0.0
Версия Win32: 1.0.0.0
Кодовая база: file:///D:/Program%20Files/Default%20Company%20Name/SalePurchaseSetup/SalePurchase.exe
----------------------------------------
Система.Окна.Формы
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Код: файл:///с:/Windows и сборки/GAC_MSIL/системы.Окна.Формы/2.0.0.0__b77a5c561934e089/система.Окна.Forms.dll
----------------------------------------
Система
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Кодовая база: file:///C:/Windows/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
Система.Рисование
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Код: файл:///с:/Windows и сборки/GAC_MSIL/системы.Чертеж/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
Системы.Данных.SqlServerCe
Версия Сборки: 3.5.0.0
Версия Win32: 3.5.5386.0
Кодовая база: file:///D:/Program%20Files/Default%20Company%20Name/SalePurchaseSetup/System.Data.SqlServerCe.DLL
----------------------------------------
Системы.Сведения
Версия Сборки: 2.0.0.0
Версия Win32: 2.0.50727.5420 (Win7SP1.050727-5400)
Кодовая база: file:///C:/Windows/assembly/GAC_32/System.Data/2.0.0.0__b77a5c561934e089/System.Data.dll
----------------------------------------
Система.Операции
версия сборки:

V.Lorz

Для меня, когда все правильно работало на ПК с Visual Studio, а не на ПК без нее, большую часть времени это было вызвано:
1) отсутствие установленной среды выполнения C++ на целевом компьютере.
2) компиляция приложения в режиме отладки без упаковки DLL времени выполнения режима отладки.
3) некоторое несоответствие компонентов (особенно наличие фреймворка 3.5 SP1 на ПК разработки и 3.5 (без SP) на целевом ПК.
4) отсутствует какой-то внешний компонент (Crystal Reports, Adobe Reader и т. д.).

Вы, вероятно, работаете в 3-м случае. Взгляните на версии SqlCe, которые вы используете на разрабатываемых и целевых ПК. Совпадают ли они?

Jawad Ahmed Tanoli

вы правы, моя проблема возникла из-за отсутствия sp1 3.5 для campact edition, когда я устанавливаю его, он работает идеально..

7 Ответов

Рейтинг:
51

Jawad Ahmed Tanoli

я включил все необходимые .dll моя проблема связана с отсутствием sp1 3.5 для campact edition на клиентском ПК.теперь он работает нормально..


Рейтинг:
2

thatraja

Я только что опубликовал этот ответ на другой вопрос, проверьте его.
Попытка чтения защищенной памяти wirte часто является признаком того, что память повреждена.[^]


Рейтинг:
2

Member 10401076

Привет, я тоже получил эту проблему, это связано с чрезмерным использованием памяти. Убедитесь, что вы остановили все ненужные процессы.


Рейтинг:
1

Member 9434774

У меня была такая же проблема. Я только что его починил. Я сослался на http://stackoverflow.com/questions/20884651/system-accessviolationexception-attempted-to-read-or-write-protected-memory-w[^] . В моем случае столбец базы данных был типа big int, и я пытался вставить int. Хотя он работал на сервере разработки , после развертывания на рабочем сервере иногда программа выходит из строя, не оставляя никаких подсказок. Я делюсь этой информацией, чтобы она могла оказать некоторую помощь тем, кто сталкивается с подобным препятствием. Ссылаться https://social.msdn.microsoft.com/Forums/en-US/8789ea67-fbc5-4a7b-a4eb-d4a8a050d5c1/attempt-to-read-or-write-protected-memory-this-is-often-an-indicating-that-other-memory-is-corrupt


Рейтинг:
1

sid_g

таким образом, ситуация выглядит примерно так, как вы пытались построить решение, и оно успешно строится, но когда вы пытаетесь запустить приложение, оно выдает вам сообщение об ошибке :

"Попытка чтения или записи защищенной памяти. Это часто указывает на то, что другая память повреждена."

Это не просто ошибка, когда вы применили некоторые изменения на уровне фреймворка, так что может быть новая установка VS или пакета обновления.

Все, что вам нужно, это изменить фреймворк с текущего (4.0) на какой-то другой фреймворк (3.0) и построить его. Пусть он тоже работает. Когда все выглядит хорошо, верните все изменения для Target framework в исходное состояние (4.0). И нам хорошо идти.

Если это поможет, пожалуйста, отметьте это как ответ на то же самое.


Рейтинг:
1

Nissim Salomon

Привет
обычно проблема, которую вы описываете, вызвана вызовом неуправляемого кода, который пытается читать или записывать в недопустимое адресное пространство. это часто называют CSE( CORRUPTED STATE EXCEPTIONS )
для устранения неполадок вам необходимо::
1.отследите код, вызывающий такое поведение:
а. сброс процесса перед его завершением с помощью sysinternals procdump util, а затем
отлаживать его с помощью WinDbg
б. вставляйте журнал в свое приложение до тех пор, пока не устраните проблему

2.Проверьте загруженные модули, которые ваше приложение использует для выполнения команд (опять же, я использую sysinternals Process Explorer для этой задачи), и сравните их с вашей машиной

извините, что у меня нет простого ответа на вашу проблему, но я настоятельно рекомендую вам найти больше ресурсов для такого рода проблем и попытаться извлечь из них уроки.


Рейтинг:
0

Ace_Hardlight

У меня была именно такая проблема. Надеюсь, это поможет кому-то в будущем. Мой проект членства (который содержит только классы) был построен для 32-битного, а мое приложение потребляло их для 64-битного. Убедился, что оба они 32-битные и проблема решена.