У меня есть dll
с командой Cmdlet
(см. Get_DemoNames.cs). Из этого cmdlet
я вызываю метод UpdateXml()
, пока все работает. Но UpdateXml()
также создает файлы, если они не существуют. Когда я звоню UpdateXml()
в файле класса, как это:AppDomain.CurrentDomain.BaseDirectory меняет неправильный каталог
var parser = new Parser();
parser.UpdateXml();
И я бегу проект он идет на правильные каталоги.
Но если я загружаю ввозных DLL, и выполнить команду DemoNames
в отдельном тестовом проекте, как это:
PM> Import-Module C:\projects\EF.XML\EF.XML.dll
PM> DemoNames
Программа идет в неправильном каталоге, в результате следующей ошибки:
Get-DemoNames : Access to the path 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\beheer_extern\config' is denied. At line:1 char:10 + DemoNames <<<< + CategoryInfo : NotSpecified: (:) [Get-DemoNames], UnauthorizedAccessException + FullyQualifiedErrorId : System.UnauthorizedAccessException,EF.XML.Get_DemoNames
Я искал в сети эту ошибку и выяснил, что некоторые другие люди смогли ее решить, добавив эту строку в конструктор:
public Parser()
{
AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory);
}
Это дает мне еще один неверный путь:
Get-DemoNames : Access to the path 'C:\Windows\system32\beheer_extern\config' is denied. At line:1 char: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();
}
}
}
Parser.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)?
Не сохранять вещи в подкаталоге исполняемого файла. Вы должны сохранять данные в AppData. – Will
@Will Это решение должно обновлять существующие проекты, которые должны иметь xml-файлы в '// www/beheer_extern/config'. Я согласен, что лучше практиковать сохранение в AppData, но это то, что я хочу сделать возможным? – Sybren
Вы используете это в powershell в визуальной студии? – Will