-1

dllコマンドを使用して を作成しましたCmdlet(Get_DemoNames.cs を参照)。これからcmdletメソッドを呼び出しますUpdateXml()。これまでのところ、すべてが機能しています。ただしUpdateXml()、ファイルが存在しない場合はファイルも作成します。UpdateXml() このようなクラスファイルを呼び出すと:

var parser = new Parser();
parser.UpdateXml();

そして、正しいディレクトリに移動するプロジェクトを実行します。

しかし、インポートをロードしてdllをロードし、次のDemoNamesように別のテストプロジェクトでコマンドを実行すると:

PM> Import-Module C:\projects\EF.XML\EF.XML.dll
PM> DemoNames

プログラムが間違ったディレクトリに移動し、次のエラーが発生します。

Get-DemoNames : パス 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\beheer_extern\config' へのアクセスが拒否されました。行:1 文字:10 + DemoNames <<<< + CategoryInfo : NotSpecified: (:) [Get-DemoNames], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,EF.XML.Get_DemoNames

ネットでこのエラーを検索したところ、他の人がコンストラクターに次の行を追加することで解決できたことがわかりました。

public Parser()
{
    AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory);
}

これにより、別の間違ったパスが得られます。

Get-DemoNames : パス 'C:\Windows\system32\beheer_extern\config' へのアクセスが拒否されました。行:1 文字:10 + DemoNames <<<< + CategoryInfo : NotSpecified: (:) [Get-DemoNames], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,EF.XML.Get_DemoNames

Get_DemoNames.cs

namespace EF.XML
{
using System;
using System.Linq;
using System.Management.Automation;

[Cmdlet(VerbsCommon.Get, "DemoNames")]
public class Get_DemoNames : PSCmdlet
{

    [Parameter(Position = 0, Mandatory = false)]
    public string prefix;

    protected override void ProcessRecord()
    {

        var names = new[] { "Chris", "Charlie", "Isaac", "Simon" };

        if (string.IsNullOrEmpty(prefix))
        {
            WriteObject(names, true);
        }
        else
        {
            var prefixed_names = names.Select(n => prefix + n);

            WriteObject(prefixed_names, true);
        }

        System.Diagnostics.Debug.Write("hello");

        var parser = new Parser();
        parser.UpdateXml();

    }

  }
}

パーサー.cs

 public class Parser
{
    public void UpdateXml()
    {
                var directoryInfo = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory); // www directory

                var path = Path.Combine(directoryInfo.FullName, @"beheer_extern\config");

                //Creates the beheer_extern\config directory if it doesn't exist, otherwise nothing happens.
                Directory.CreateDirectory(path);

                var instellingenFile = Path.Combine(path, "instellingen.xml");
                var instellingenFileDb = Path.Combine(path, "instellingenDb.xml");

                //Create instellingen.xml if not already existing
                if (!File.Exists(instellingenFile))
                {
                    using (var writer = XmlWriter.Create(instellingenFile, _writerSettings))
                    {
                        var xDoc = new XDocument(
                            new XElement("database", string.Empty, new XAttribute("version", 4)));
                        xDoc.WriteTo(writer);
                    }
                }
      }
}

プロジェクトの正しいディレクトリ (www ディレクトリ) を取得するにはどうすればよいですか?

4

2 に答える 2

0

さて、パッケージ マネージャー コンソール内から、Visual Studio 内に読み込まれたプロジェクトにアクセスしようとしています。

実行可能ファイルはVisual StudioでありAppDomain.CurrentDomain.BaseDirectory、Visual Studio のインストール ディレクトリになることを知っておいてください。絶対に現在のプロジェクトのディレクトリにはなりません。

現在読み込まれているソリューションのプロジェクト ディレクトリを取得するには、オートメーションを介して Visual Studio の実行中のインスタンスと対話する必要があります。通常、これは、拡張機能を作成するか、Visual Studio コア オートメーション (別名 EnvDTE com object ) を介して行われます。これは複雑です。これをしたいですか?おそらく、このテーマに関する本を手に取って読む必要があるでしょう。

幸いなことに、PMC には、これを大幅に簡素化するコマンドレットget-projectが用意されています。project の DTE 表現を返します。これを使用してプロジェクト ファイルの完全な filenameを取得し、そこからディレクトリ名を取得できます。

それらはあなたが必要とする部品と部品です。コードからコマンドレットを呼び出すことについては、別の問題です。

于 2015-10-21T17:04:29.773 に答える