1

Sybaseドライバの使用で問題が発生しています。Sybaseが接続を作成しようとすると、次のようになります。

[AseException: Could not load C:\Windows\TEMP\Sybase.AdoNet4.AseClient.32bits.4.157.501.0\sbgse2.dll]
   Sybase.Data.AseClient1.AseConnection.SaveAndLoadLibrary(String dirName, String dllName, Int32 bits) +419
   Sybase.Data.AseClient1.AseConnection.LoadLibraries() +243
   Sybase.Data.AseClient1.AseConnection..cctor() +5

[TypeInitializationException: The type initializer for 'Sybase.Data.AseClient1.AseConnection' threw an exception.]
   Sybase.Data.AseClient1.AseConnection..ctor(AseConnection realConnection) +0
   Sybase.Data.AseClient.AseConnection..ctor() +27

Sybaseは、アンマネージコードを埋め込みリソースとしてコンパイルし、実行時にこれらのファイルが一時ディレクトリにない場合は、そこにコピーします。

私の場合、ファイルが実際に存在していることがわかります。それらを削除して、実行時にコピーして戻すこともできます。

なぜロードできないのか、今は困惑しています。

このマシンは、かつて.net4.5を実行していました。アンインストールされ、.net4.0が再インストールされました。それがそれと関係があるかどうかはわかりません。

これがSybaseドライバーの関連コードです

    private static void LoadLibraries()
   {
     int bits = IntPtr.Size * 8;
     string str = Path.Combine(Path.GetTempPath(),    Assembly.GetExecutingAssembly().GetName().Name + "." + bits.ToString() + "bits." +    ((object) Assembly.GetExecutingAssembly().GetName().Version).ToString());
     if (!Directory.Exists(str))
       Directory.CreateDirectory(str);
       Sybase.Data.AseClient1.AseConnection.SaveAndLoadLibrary(str, "sbgse2.dll",   bits);
     Sybase.Data.AseClient1.AseConnection.SaveAndLoadLibrary(str, "sybdrvado20.dll", bits);
   }

   private static void SaveAndLoadLibrary(string dirName, string dllName, int bits)
   {
     string str = Path.Combine(dirName, dllName);
     if (!File.Exists(str))
     {
       using (Stream manifestResourceStream =    Assembly.GetExecutingAssembly().GetManifestResourceStream("Sybase.Data.AseClient.Resources._" + bits.ToString() + "bits." + dllName))
       {
         try
         {
           using (Stream stream = (Stream) File.Create(str))
           {
             byte[] buffer = new byte[4096];
             while (true)
             {
               int count = manifestResourceStream.Read(buffer, 0, 4096);
               if (count >= 1)
                 stream.Write(buffer, 0, count);
               else
                 break;
             }
             stream.Close();
           }
         }
         catch
         {
         }
       }
     }
     if (Sybase.Data.AseClient1.AseConnection.LoadLibrary(str) == IntPtr.Zero)
       throw new AseException("Could not load " + str);
  }

   [DllImport("kernel32.dll")]
   public static IntPtr LoadLibrary(string dllToLoad);

何か考えやアイデアはありますか?

4

4 に答える 4

1

(何らかの理由で)c:\ windows \ tempにコピーされたファイルが、このコードが初期化されたAppPoolから特別なアクセス許可を取得したため、他のアプリプールがファイルを読み取れなくなったようです。このため、AccessDeniedタイプの例外が予想されました。

それはまだ少し魔法であり、せいぜい手を振っていますが、ファイルからアプリプールの特別な権限を削除し、一時ディレクトリを削除し、再起動することで、エラーのあるアプリケーション(別のアプリプール内)がこの例外をスローするのを防ぎました。特別なアクセス許可も一時ファイルに再表示されていません。

于 2013-03-06T16:40:27.073 に答える
0

すべてのアプリケーションプールIDはIISワーカープロセスグループに含まれている必要があるため、解決策は、IISグループのC:\ Windows\TEMPフォルダーに変更アクセス許可を付与することです。

  • IIS6IIS_WPG
  • IIS7IIS_IUSRS

権限は正しく継承されます(Windows Server2008およびIIS7で確認済み)。

于 2013-05-21T12:32:06.190 に答える
0

最終的に私のために働いたのは、アプリケーションプールを同じIDに割り当てることでした。

  1. 両方のアプリケーションプールを停止します
  2. ディレクトリ「Windows\temp\Sybase.AdoNet4.AseClient.32bits.4.157.1000.0」を削除します
  3. IDNETWORKSERVICEを両方のアプリケーションプールに割り当てます
  4. 両方のアプリケーションプールを開始します。
  5. すべてが機能するはずです。

  6. 手順1と2を実行します。

  7. [コントロールパネル]>[管理ツール]>[コンピューターの管理]>[ローカルユーザーとグループ]>[ユーザー]に移動して、カスタムIDを作成しました
  8. 右クリックして「新規ユーザー...」を選択します
  9. 新しいユーザー名とパスワードを追加する
  10. [作成]ボタンをクリックしてダイアログを閉じます
  11. IISで、最初の[アプリケーションプール]>[詳細設定]を選択します
  12. [ID]フィールドをクリック>[...]ボタンをクリックします
  13. カスタムアカウントを選択し、[設定...]ボタンをクリックします
  14. 新しいユーザーアカウント情報を入力し、[OK]をクリックします
  15. [OK]をクリックして、[アプリケーションプールID]ダイアログを閉じます
  16. [OK]をクリックして、[詳細設定]を閉じます。
  17. 2番目のアプリケーションプールに対して手順11〜16を繰り返します
  18. 手順4を実行します。

最後に、web.configで、セクションsystem.serviceModelのタグserviceHostingEnvironmentにmultipleSiteBindingsEnabled="true"を指定する必要がある場合があります。

于 2015-10-30T12:15:20.640 に答える
0

AppPoolのIDをApplicationPoolIdentityからLocalSystemに変更してみてください。

于 2019-04-26T10:57:05.000 に答える