2016-04-01 13 views
1

私は、その性質上、業務時間外に実行してユーザーのワークフローを中断しないようにする必要があるアプリケーションを持っています。私はダウンロードして、Microsoft.Win32.TaskScheduler.dllへの参照を追加しました。これは、その日後にタスクを実行するスケジュールを立てる最良の方法に関する別の質問にお勧めしています。デバッグでc#コンソールアプリケーションMicrosoft.Win32.TaskScheduler.dll展開時FileNotFoundException

予想通り、プログラムは動作しますが、しかし展開するときに、私は次のエラーを取得する:

Unhandled Exception: System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Win32.TaskScheduler, Version=2.5.16.0, Culture=neutral, PublicKeyToken=0d013ddd5178a2ae' or one of its dependencies. 

これは、それが構築されていたときにDLLが正しく実行ファイルに追加されていないと信じて私をリード。

私はこの解決するために撮影したステップ:ソリューションエクスプローラーで

  1. は、Microsoft.Win32.TaskSchedulerローカルコピープロパティは、プロジェクトのプロパティ
  2. Trueの確保、アプリケーションファイルを公開 - Microsoft.Win32を。パブリッシュ、必須ダウンロード、ハッシュ
  3. は、依存関係を削除し、再度追加
  4. this answer
での提案に従っ含めるに含めるTaskScheduler.dll

すべてがこの時点で失敗しました。 .dllが/ bin/debugフォルダにあることを確認できます。さらに、手動で同じ方法で​​を追加しましたが、期待通りに機能するようです。

追加の提案がある場合は、それを感謝します。

+0

デプロイメントにTaskScheduler dllを含めましたか? IOW、あなたのbinフォルダだけでなく、.exeが実行されている場所? –

+0

TaskScheduler.dllを展開されたプログラムと同じディレクトリに配置して実行すると、プログラムが正しく起動します。しかし、このデプロイメントがどのように設定されているので、私は1つのファイルに制限されています。編集:私はリソースとしてDLLを追加し、実行時にファイルディレクトリにファイルを書き込むか、オルタット/より良い解決策はありますか? –

+1

その後、展開の設定を変更する必要があるように聞こえます。アプリを実行するためにDLLが必要な場合は、DLLをデプロイする必要があります。 –

答えて

0

私はderpirscherのソリューションを使用しようとしましたが、私が使用した解決策は、プログラムの実行ディレクトリにdllを導入することでした。これは最も洗練されたソリューションではありませんが、「単一ファイル展開」の要件を満たしています。ただし、これが展開されているすべてのシステムで、ユーザーアカウントは管理者であることに注意してください。実行可能ファイルの実行元(別のユーザーのアカウントフォルダなど)によって、プログラムが実行されているユーザーが管理者でない場合、この解決策は機能しない可能性があります。

class Program 
{ 
    //Deploys the DLL to the location of the executable, as suggested by B. Clay Shannon 
    //The Program() method runs before Main() and allows for regisration or placement 
    //of files before the program "starts". Placing this line in Main() 
    //causes a FileNotFound exception when it tries to register the assembly. 
    static Program() 
    { 
     //The dll has been added as a resource, build action "Content". 
     //Note the underscores in "Microsoft_Win32_TaskScheduler" 
     //Adding the dll to the resource manager replaces '.' with '_' in the resource name 
     File.WriteAllBytes(string.Format("{0}{1}", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "\\Microsoft.Win32.TaskScheduler.dll"), FindResourceByName("Microsoft_Win32_TaskScheduler")); 
    } 

    static void Main(string[] args) 
    { 
     ... 
    } 

    /// <summary> 
    /// Returns a byte array of the object searched for 
    /// </summary> 
    /// <param name="objectName">Name of the resource object</param> 
    /// <returns>Byte array of the specified resource object</returns> 
    private static byte[] FindResourceByName(string objectName) 
    { 
     object obj = Properties.Resources.ResourceManager.GetObject(objectName); 
     return ((byte[])(obj)); 
    } 
} 
関連する問題