Страница: 1 |
Страница: 1 |
Вопрос: проблема с памятью
Добавлено: 24.08.06 14:23
Автор вопроса: Екатерина
VB Net
Есть exe, вызывает Excel, открывает книги.
Public WithEvents oExcel As Excel.Application
Public MyNewBook As Object
Private WithEvents oWorkSheet As Excel.Worksheet
tExcelObj = Type.GetTypeFromProgID("Excel.Application")
oExcel = Activator.CreateInstance(tExcelObj)
Потом вызывает dll - туда передает книги
MyDll = New MyDll.Class1
Public oExcClass As Object
Public MyDllNewBook As Object
MyDll.oExcClass = System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application")
и в функции dll по имени книги обновляю переменную
MyDllNewBook = oExcClNorm.Workbooks(NameBook)
После всей отработки убиваю dll b pfxbof. t` gthtvtyyst
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcClass)
System.Runtime.InteropServices.Marshal.ReleaseComObject(MyDllNewBook)
и далее из exe пытаюсь закрыть книги
Do While oExcel.Workbooks.Count <> 0
Try
System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel.Workbooks(1))
oExcel.Workbooks(1).Saved = True
oExcel.Workbooks(1).Close()
Catch err As Exception
'''err.Message =
Finally
GC.Collect()
End Try
Loop
при этом книги не закрываются и
'''err.Message = "Ошибка на сервере"
Помогите....
Ответы
Всего ответов: 4
Номер ответа: 1
Автор ответа:
VβÐUηìt
Вопросов: 246
Ответов: 3333
Web-сайт:
Профиль | | #1
Добавлено: 25.08.06 09:22
?
Номер ответа: 2
Автор ответа:
Екатерина
Вопросов: 23
Ответов: 25
Профиль | | #2
Добавлено: 28.08.06 13:38
Что-то не понятно?
Номер ответа: 3
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #3
Добавлено: 04.09.06 20:46
Я вот эту строку не вполне понял - это типа передача объекта в библиотеку? А библия комовская что ли? Почему просто объект не передать?
А этот если этот кусок из dll, то откуда переменная MyDllNewBook
System.Runtime.InteropServices.Marshal.ReleaseComObject(MyDllNewBook)
А при убийстве библиотеки там случаем не уничтожаются объекты?
А не попробовать ли использовать чисто комовские библии для работы с экселем (через CreateObject - как в VBScript)?
А нельзя ли вообще обойтись самым простейшим способом формирования экселевских файлов - обычные текстовые файлы, где через табуляцию указываешь столбцы, а через Enter'ы - строки?
Номер ответа: 4
Автор ответа:
Екатерина
Вопросов: 23
Ответов: 25
Профиль | | #4
Добавлено: 15.09.06 14:04
К сожалению Excel необходим.
Public MyDllNewBook As Object
- объявлена в библотеке
перед тем как убить библотеку
в её функции пытаюсь убить объекты
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
For k = 1 To ClSheet.Count
' ClSheet - класс где есть переменная
' Public MySheet As Excel.Worksheet
ClSheet(1).MyFinalize()
'теперь убила? If Not Me.MySheet Is Nothing Then Me.MySheet = Nothing
ClSheet.Remove(1)
Next k
ClSheet = Nothing
If Not MyFNewBook Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(MyFNewBook)
MyFNewBook = Nothing
If Not MyNewCells Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(MyNewCells)
MyNewCells = Nothing
If Not oExcelMyF Is Nothing Then System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcelMyF)
oExcelMyF = Nothing
MyGui = Nothing
End If
MyBase.Dispose(disposing)
End Sub