- - PR -
asp.net2.0にてDLL(アンマネージコード)を使用する方法
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-09-23 16:39
asp.netにて自作DLLを参照しています。
このDLLはマルチスレッド対応がされていないため、 複数の要求が来ると意図しない動作をしてしまいます。 (グローバル変数を使用しているため) Session毎にDLLのインスタンスを作成するようなイメージで 出来ないかと思っています。 なにか良い方法をご存知の方がいましたらご教授ください。 | ||||||||
|
投稿日時: 2006-09-23 18:15
普通にアトミックな単位でロックしたら?それで十分な気がする。
| ||||||||
|
投稿日時: 2006-09-23 21:25
ロックにしてしまうと、複数の要求を同時に処理
出来なくなるために、ユーザ(Session?)ごとに 別のメモリ空間で動作するようなことをしたいと思っています。 クライアント/サーバで動作していたものをWebで動作させたいので、 こんな変なことになってしまっています。 | ||||||||
|
投稿日時: 2006-09-23 22:18
無理でしょうね。とんでもなく膨大なリソースが必要になると思いますよ。 問題の DLL がどんな作りになっているのか、我々には把握できないので適切な回答をするのは困難ですが、.NET で作られているんですよね? 厳密にはグローバル変数なんてものは存在しないのですが、静的変数の事ですか?
しょうがないです。だから一瞬だけロックするんです。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2006-09-23 22:42
DLLはVC++です。VS2005でリコンパイルしています。
もし可能であるならどういった方法で 可能なのか、教えていただきたいと思います。
これは重々承知の上なので、頭が痛いところなんです。。。 | ||||||||
|
投稿日時: 2006-09-24 00:41
1セッションを1プロセスで処理すること以外、.dll の不備を回避することは出来なさそうなので、ASP.NET では(ASP でも)回避不能と思います。 太古の昔に戻って、.exe を cgi 起動するとか位しか解決策は無いんじゃないでしょうか。 [ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-09-24 12:53 ] | ||||||||
|
投稿日時: 2006-09-24 14:46
誤解を生む書き方をしてしまいました。すみません。 無理です。 どういう用途でグローバル変数使ってるのかなぁ。 ソースを触れるのなら TLS(スレッドローカルストレージ)を使って対処できたりしないでしょうか。
後、こう言われても、どんな開発環境を使って実装しているのかが分かっても、何で実装されているのかが分かりません。 _________________ 囚人のジレンマな日々 | ||||||||
|
投稿日時: 2006-09-25 01:25
で、それの何が問題なの? スループット的な問題?それについては、もともとWebシステムはスケーラビリティは最大限考慮されているので、IIS6のアプリケーション分離モードでプロセスでの多重化もできるし、付加分散装置でマシンですら多重化もできるんだけど、それでも解決できない問題ですか(まぁ、InProc前提なんかで作っちゃったシステムが意外にあるけどさ)? 根本的な解決策はDLLをマルチスレッドに対応することだ。囚人さんが言うようにTLSを使えば変更は最小限でしょうし(declspecが使える?…無理だろうなぁ、TLSのAPIを直で使ってください)。 次に考慮するとして、マネージ側で調停(いわゆるロックね…ただしThread Affinityも考慮したほうがいいかもしれない。アンマネージラッパでは必ず通る道だけど)させて、スループット的な問題は運用で回避。 たぶん普通はこの辺までで対応できて(して)しまうと思うよ。少なくとも自分はDLLのローダの領域に手を出そうだなんて思いません。Advanced Windows片手にいじるのは楽しいでしょうが。 # …いや、待てよ。確か名前がアイデンティティなのでセッション(あるいは # スレッド)度に同じバイナリを名前変えてコピーしてLoadLibraryして # GetProcAddressしてGetDelegateForFunctionPointerしたらひょっとして # いける?有識者求む |