Страница: 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
 VβÐUηìt



Вопросов: 246
Ответов: 3333
      
 Web-сайт:  
 Профиль |  | #1
      
Добавлено:  25.08.06 09:22
       
    
       
  
?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 2 
      
Автор ответа: Екатерина
 Екатерина



Вопросов: 23
Ответов: 25
      
 Профиль |  | #2
       
Добавлено:  28.08.06 13:38
       
    
       
  
Что-то не понятно?
 
    
		
	  
			 
	
		 
    
       
    
Номер ответа: 3 
      
Автор ответа: Neco
 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