dポイントプレゼントキャンペーン実施中!

ASP.NET 2.0(VB)からEXCELオブジェクトを起動・操作し、クライアントにDLさせる仕組みを実装しようとしています。
DCOMコンポーネントにASP.NETユーザーを権限追加し、以下のコードでDLさせることはできたのですが、イベント発行からDLボックスが表示されるまでのレスポンスが60秒掛かってしまっています。

サーバーのタスクを監視してると
(1)でEXCELプロセス起動までは、1~2秒後
(2)でファイル作成されるのが、60~70秒後

DCOMによるオートメーションではこんなに時間掛かるものなのでしょうか?
デバッグ環境(XP)では、数秒で動作できているので
オートメーション、もしくはActiveDirectoryに因果しているのかと思っています。
レスポンスを早くするなにか解決策などありましたらご教授願います。
また、以下のコードではリソースが解放されずにリークが発生してしまっています。
こちらもなにか解決案ありましたらよろしくお願いします。

[サーバー環境]
OS:Server 2003、IIS:6.0、Excel 2002


Protected Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button.Click

Dim objExApp As Excel.Application
objExApp=Server.CreateObject("Excel.Application")    '<----(1)
objExApp.Application.DisplayAlerts=False
Dim objExBooks As Excel.Workbooks
objExBooks=objExApp.Workbooks
Dim objExBook As Excel.Workbook
objExBook=objExBooks.Add
Dim objExSheets As Excel.Sheets
objExSheets=objExBook.Sheets
Dim objExSheet As Excel.Worksheet
objExSheet=objExSheets(1)
Dim objExCell As Excel.Range
objExCell=objExSheet.Cells

objExCell(1, 1)="EXCEL操作"
objExBook.SaveAs(Server.MapPath("ファイル名"))    '<----(2)

If Not objExCell Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExCell)
objExCell=Nothing
End If
If Not objExSheet Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExSheet)
objExSheet=Nothing
End If
If Not objExSheets Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExSheets)
objExSheets=Nothing
End If
If Not objExBook Is Nothing Then
objExBook.Close()
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExBook)
objExBook=Nothing
End If
If Not objExBooks Is Nothing Then
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExBooks)
objExBooks=Nothing
End If
If Not objExApp Is Nothing Then
objExApp.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(objExApp)
objExApp=Nothing
End If

GC.Collect()
System.Windows.Forms.Application.DoEvents()

Response.Redirect("ページ名")

End Sub

A 回答 (1件)

メモリリークについてコメントいたします。



RCWの内部マーシャリングにおけるデクリメントは、
ReleaseComObjectメソッドではなく、
FinalReleaseComObjectで開放したほうが安全だと思われます。
(.NET Framework 2.0以降)

参考URL:http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm
    • good
    • 0
この回答へのお礼

ありがとうございます。
確かにReleaseComObjectでは1つ参照をデクリメントするだけですね。
RCWのことを考えながらコードを見直したところ、Rangeオブジェクトの参照のところで解放漏れしていたみたいです。

使い終わるごとにReleaseComObject。
Finallyで
FinalReleaseComObject
とすることでリークを修正することができました。
大変参考になりました。ありがとうございました。

サーバーレスポンスが悪かった件は、
IIS側の匿名アクセスにてAdministratorsグループのユーザーを割り当てることで解決しました。
原因は不明ですが、IUSR_xxx(Guestグループ)では時間が掛かっていたみたいです。

お礼日時:2010/11/04 11:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!