2012-02-14 10 views
3

私はC#からDllImportを使用して呼び出すネイティブDLLの形式でサードパーティ製のAPIを使用しています。このネイティブdllは、開かれているサードパーティのアプリケーションに依存します。ネイティブDLLへの呼び出しが.NET Windowsサービスから失敗する

通常、コードを実行すると、APIが期待していることを行い、アプリケーションを駆動します。しかし、Windowsサービスと同じコードを実行すると、自分でもAPIはアプリケーションが閉じられたときと同じ(文書化されていない)エラーコードを返します。プロセスエクスプローラは、ネイティブdllがアプリケーションディレクトリから正しくロードされていることを確認します。

これを引き起こしている可能性がありますが、どのように問題を解決できますか?

+0

エラーがどこで発生するかを判断するために、ダミーのアンマネージドDLLを使用しようとしましたか?p/invokeまたはdll自体にありますか? – abatishchev

+0

@abatishchev - いいえ、それは間違いなくサービスに問題はありません。サービスを取り除いて、すべてがp /アンマネージドdllを呼び出すようにしました。私はFadrian Sudamanは、問題がアプリケーションやサービスを別のセッションで実行しているとか、そういうことであると言っても間違いないと思う。サードパーティーのソフトウェアは、ほとんど言わないでかなりropeyです。 – briantyler

+0

コンソールアプリケーションからのp/invokeは正常に動作し、Windowsサービスからのものではありませんか? – abatishchev

答えて

1

少し古くなっていますが、検索結果の上位に表示されます。だから、私のデータは依然として役に立つだろう。

私はC#からDllImportを使用して呼び出すネイティブDLLの形式でサードパーティ製のAPIを持っています。このネイティブdllは、開かれているサードパーティのアプリケーションに依存します。

(t)rusty Office Interop DLLは、同じ方法です。実際に問題のOffice Programのバックグラウンドインスタンスを開始しています。 バックグラウンドインスタンスには何も表示されていなくても、インタラクティブなセッションが必要です(仕事中のデザイン上の間違い/間違い)。 サービスはinteractive session since Vistaで実行されません。上書きの使用はお勧めできません。 これは、Office Interopをもう使用しない理由(3?)の1つです。

回避策:

  1. サービスを使用して停止します。 Windowsタスクスケジューラは、完全なインタラクティブセッションを提供しながら、同じ作業についてjsutを行うことができます。 MS自身でさえも、可能な限り、Shedulerにサービスを移し始めました。
  2. ヘルパープロセスにDLLアクセスを移動します。それはインタラクティブなセッションで実行できます。ヘルパーとメインサービスの間で話すには、プロセス間通信の方法を使用します。このパターンは、主にx64プログラムからのdllのみを扱うために使用されますが、ここでも有効です。マニフェストとProcess.Start()の両方は、サービスから対話的にプログラムを開始する方法を持っています。

コメントの1つに基づいて、オプション2を選択したように見えますが、代わりにWebサービスを使用しているようです。 残念ながら、Webservices/Webアプリケーションは通常、Windowsサービスとして実行されます。そして、それはあなたが最も制限的な権利のいくつかの下で走っていると考えられる前です(ウェブに到達可能であるため)。 それでは、正方形1に戻ったり、別のステップを逆さまにして正方形0に戻したりします。

+0

更新について感謝します。 – briantyler

1

伝えるのは難しいが、私は考えることができる3つの可能性があります:

  • があなたのサービスは、Windowsサービスのための作業ディレクトリは%WINDIRある必要が「対話デスクトップとの」オプションが
  • をチェックするUIコンポーネントを持っています%system32(例:C:\ windows \ system32)、dllには見つからない他のリソースへの相対パス参照を使用するコードがある
  • 2つの異なるセッションで実行されるアプリケーションとネットピップ通信を使用します。
+0

私は1を試しましたが、それは効果がありません。このコードは、パスを指定せずに任意の場所から実行することができるので、ルールは2になります。しかし、3つの可能性があります - サービスはアプリケーションとは異なるセッション/ドメインで実行されています。これを確認するにはどうすればよいのでしょうか? – briantyler

+0

残念ながらそれほど多くはありません。セッションの分離は、OSのセキュリティの一部です。 "netpipe session isolation"の行に沿ってstackoverflowやゴーグルを検索し、示唆された回避策を試すことができますが、個人的にはかなり困難な旅になると思います。 –

+1

私は、ハックは、起動時に実行され、WebサービスからそのWebサービスにコールするWebサービスにdllをラップすることだと思います。それはほぼ確実に機能するはずです。私はプロジェクトがとにかくすぐに缶詰めになることを期待しています:) – briantyler