- PR -

asp.net2.0にてDLL(アンマネージコード)を使用する方法

投稿者投稿内容
JBOY
ベテラン
会議室デビュー日: 2003/02/27
投稿数: 72
投稿日時: 2006-09-23 16:39
asp.netにて自作DLLを参照しています。
このDLLはマルチスレッド対応がされていないため、
複数の要求が来ると意図しない動作をしてしまいます。
(グローバル変数を使用しているため)

Session毎にDLLのインスタンスを作成するようなイメージで
出来ないかと思っています。

なにか良い方法をご存知の方がいましたらご教授ください。
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-09-23 18:15
普通にアトミックな単位でロックしたら?それで十分な気がする。
JBOY
ベテラン
会議室デビュー日: 2003/02/27
投稿数: 72
投稿日時: 2006-09-23 21:25
ロックにしてしまうと、複数の要求を同時に処理
出来なくなるために、ユーザ(Session?)ごとに
別のメモリ空間で動作するようなことをしたいと思っています。

クライアント/サーバで動作していたものをWebで動作させたいので、
こんな変なことになってしまっています。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-09-23 22:18
引用:

ユーザ(Session?)ごとに
別のメモリ空間で動作するようなことをしたいと思っています。


無理でしょうね。とんでもなく膨大なリソースが必要になると思いますよ。

問題の DLL がどんな作りになっているのか、我々には把握できないので適切な回答をするのは困難ですが、.NET で作られているんですよね?
厳密にはグローバル変数なんてものは存在しないのですが、静的変数の事ですか?

引用:

ロックにしてしまうと、複数の要求を同時に処理
出来なくなるために


しょうがないです。だから一瞬だけロックするんです。
_________________
囚人のジレンマな日々
JBOY
ベテラン
会議室デビュー日: 2003/02/27
投稿数: 72
投稿日時: 2006-09-23 22:42
DLLはVC++です。VS2005でリコンパイルしています。
引用:
無理でしょうね。とんでもなく膨大なリソースが必要になると思いますよ。


もし可能であるならどういった方法で
可能なのか、教えていただきたいと思います。

引用:
しょうがないです。だから一瞬だけロックするんです。


これは重々承知の上なので、頭が痛いところなんです。。。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2006-09-24 00:41
引用:

もし可能であるならどういった方法で
可能なのか、教えていただきたいと思います。



1セッションを1プロセスで処理すること以外、.dll の不備を回避することは出来なさそうなので、ASP.NET では(ASP でも)回避不能と思います。

太古の昔に戻って、.exe を cgi 起動するとか位しか解決策は無いんじゃないでしょうか。


[ メッセージ編集済み 編集者: 渋木宏明(ひどり) 編集日時 2006-09-24 12:53 ]
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-09-24 14:46
引用:

もし可能であるならどういった方法で
可能なのか、教えていただきたいと思います。


誤解を生む書き方をしてしまいました。すみません。
無理です。

どういう用途でグローバル変数使ってるのかなぁ。
ソースを触れるのなら TLS(スレッドローカルストレージ)を使って対処できたりしないでしょうか。

引用:

DLLはVC++です。VS2005でリコンパイルしています。


後、こう言われても、どんな開発環境を使って実装しているのかが分かっても、何で実装されているのかが分かりません。
_________________
囚人のジレンマな日々
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-09-25 01:25
引用:


ロックにしてしまうと、複数の要求を同時に処理
出来なくなるために、ユーザ(Session?)ごとに
別のメモリ空間で動作するようなことをしたいと思っています。



で、それの何が問題なの?
スループット的な問題?それについては、もともとWebシステムはスケーラビリティは最大限考慮されているので、IIS6のアプリケーション分離モードでプロセスでの多重化もできるし、付加分散装置でマシンですら多重化もできるんだけど、それでも解決できない問題ですか(まぁ、InProc前提なんかで作っちゃったシステムが意外にあるけどさ)?

根本的な解決策はDLLをマルチスレッドに対応することだ。囚人さんが言うようにTLSを使えば変更は最小限でしょうし(declspecが使える?…無理だろうなぁ、TLSのAPIを直で使ってください)。
次に考慮するとして、マネージ側で調停(いわゆるロックね…ただしThread Affinityも考慮したほうがいいかもしれない。アンマネージラッパでは必ず通る道だけど)させて、スループット的な問題は運用で回避。

たぶん普通はこの辺までで対応できて(して)しまうと思うよ。少なくとも自分はDLLのローダの領域に手を出そうだなんて思いません。Advanced Windows片手にいじるのは楽しいでしょうが。

# …いや、待てよ。確か名前がアイデンティティなのでセッション(あるいは
# スレッド)度に同じバイナリを名前変えてコピーしてLoadLibraryして
# GetProcAddressしてGetDelegateForFunctionPointerしたらひょっとして
# いける?有識者求む

スキルアップ/キャリアアップ(JOB@IT)