
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
No.1ベストアンサー
- 回答日時:
メモリリークについてコメントいたします。
RCWの内部マーシャリングにおけるデクリメントは、
ReleaseComObjectメソッドではなく、
FinalReleaseComObjectで開放したほうが安全だと思われます。
(.NET Framework 2.0以降)
参考URL:http://hanatyan.sakura.ne.jp/dotnet/Excel01.htm
ありがとうございます。
確かにReleaseComObjectでは1つ参照をデクリメントするだけですね。
RCWのことを考えながらコードを見直したところ、Rangeオブジェクトの参照のところで解放漏れしていたみたいです。
使い終わるごとにReleaseComObject。
Finallyで
FinalReleaseComObject
とすることでリークを修正することができました。
大変参考になりました。ありがとうございました。
サーバーレスポンスが悪かった件は、
IIS側の匿名アクセスにてAdministratorsグループのユーザーを割り当てることで解決しました。
原因は不明ですが、IUSR_xxx(Guestグループ)では時間が掛かっていたみたいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
キヤノン アソビカメラ iNSPiC ...
-
vba マージエリアの行数を非表...
-
ffftpでファイル取得が0バイト...
-
VBAでPDFを作成する際、同じ名...
-
バッチ(bat)でリストファイルか...
-
Windowsで複数のファイルを同じ...
-
SJISで、全角文字Aの文字コード...
-
vba 空のデータをSplitする時の...
-
お世話になります。 Windows Up...
-
マクロで同じフォルダにある画...
-
エクセル・アプリケーションエ...
-
エクセルのファイル名をコピー...
-
ASP.NetでWebアプリ開発の経験...
-
エクセルに張り付けた写真のフ...
-
たくさんのフォルダーの中から...
-
SPO2測定
-
高校1年生情報の問題について。
-
エクセルのマクロについて教え...
-
インドe-Visa 承認書のApplicat...
-
SPIの非言語の割合と比が難しく...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチスクリプト処理でエラー...
-
バッチファイルで多重起動を防ぐ
-
VBでExcelが起動されているか知...
-
_access関数が EACCES エラーと...
-
VB6 二重起動確実防止について
-
常駐し他のプロセスの起動を取...
-
Linux環境変数設定(putenv?se...
-
コンソールアプリの起動結果待...
-
ASP.NET 2.0(VB)からEXCELオブ...
-
CreateProcessでコンソールアプ...
-
VBを用いてログオフから自動で...
-
外部プロセス起動時に発生する...
-
shell関数について
-
デーモンプロセスの起動について
-
Open Office Org 急に起動しな...
-
Apache2が起動しません
-
PC起動後に・・・
-
プリンタの状態を知る方法
-
仮想メモリ増加
-
CSHが使えない REDHAT
おすすめ情報