Обновление: я изменил сообщение согласно комментариям.
Это будет довольно длинный пост, извиняюсь за это, но я хочу, чтобы люди поняли, что я пытаюсь сделать, прежде чем его подстрелить. Ранее я задал несколько вопросов о создании методов для создания XML в C ++ / CLI, и я хочу продолжать их использовать.
Недавно я начал тестировать C # и WPF, и я действительно наслаждаюсь творчеством и свободой, которую он предлагает для визуальных эффектов. Я начал преобразовывать функции приложения, над которым я сейчас работаю, в DLL, в основном, поэтому мне не нужно переделывать работу, которую я уже проделал, и потому что я хочу научиться и получить некоторый опыт в написании DLL и использовании взаимодействия.
Каждая функция до сих пор имела только один вход или выход. Однако мои последние две функции (которые берут список имен файлов и хэш самого файла и для каждого файла и хеш-код сохраняет его в файл xml) не работают так хорошо для меня. Я получаю вывод, но не в той форме, в которой я его хочу, поэтому очевидно, что моя логика ошибочна, но я не уверен, как ее исправить.
Функции очень похожи, единственное отличие состоит в том, что один создает совершенно новый xml, а второй обновляет существующий xml. Они оба прекрасно работали раньше как прямые функции C ++ / CLI, однако теперь, когда мне нужно использовать их в C #, я должен поместить их в итерации, чтобы они работали для каждого из файлов и их хэши отображались в списках.
Ниже приведена одна из функций в Dll, где я теперь заменил предыдущие жестко запрограммированные переменные, которые были бы listBox2-> Items [x] -> ToString (), как переменные, такие как CurrentFile, которые теперь определены в .cs.
public: void XMLUpdate(String^ Location, int NumberItems, String^ ProjectName,
String^ ProjectTC, String^ CurrentFile, String^ CurrentHash)
{
try
{
XmlDocument^ XmlDoc = gcnew XmlDocument();
XmlDoc->Load(Location);
XmlElement^ NewProject = XmlDoc->CreateElement("Project");
NewProject->SetAttribute("Name", ProjectName);
XmlDoc->DocumentElement->AppendChild(NewProject);
XmlElement^ NewTestCycle = XmlDoc->CreateElement("TestCycle");
NewTestCycle->SetAttribute("Number", ProjectTC);
NewProject->AppendChild(NewTestCycle);
XmlElement^ NewFile = XmlDoc->CreateElement("Files");
NewTestCycle->AppendChild(NewFile);
for (int x = 0; x < NumberItems; ++x)
{
String^ FileName = CurrentFile;
String^ Hash = CurrentHash;
XmlElement^ NewFileName = XmlDoc->CreateElement("FileName");
NewFileName->SetAttribute("File", FileName);
NewFile->AppendChild(NewFileName);
XmlElement^ NewHashCode = XmlDoc->CreateElement("HashCode");
NewHashCode->SetAttribute("Code", Hash);
NewFile->AppendChild(NewHashCode);
}
XmlDoc->Save(Location);
return;
}
catch(Exception^)
{
return;
}
}
Вот вызов метода из библиотеки DLL в моей форме WPF:
private void button2_Click(object sender, RoutedEventArgs e)
{
DllTest.Funtions Functions = new DllTest.Funtions();
String Name = textBox1.Text;
String TC = textBox2.Text;
String Location = "C:\\Users\\brandonm\\Desktop\\Backup\\XML\\test1.xml";
int Number = listBox2.Items.Count;
for (int x = 0; x < listBox2.Items.Count; ++x)
{
Functions.XMLUpdate(Location, Number, TC, Name, listBox2.Items[x].ToString(),
listBox3.Items[x].ToString());
}
}
Вывод занимает только последний элемент в списке и дублирует его по номеру в списке, в этом случае список имеет 3 имени файла, а второй список содержит 3 хеша. Вот пример:
<?xml version="1.0" encoding="utf-8"?>
<Project Name="New">
<TestCycle Number="1">
<Files>
<FileName
File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode
Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
<FileName
File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode
Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
<FileName
File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode
Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
</Files>
</TestCycle>
</Project>
</Project>
Итак, вот вторая функция, которая обновляет существующий XML и дает мне совершенно другой вывод, но неверный, по сравнению с выводом в новой функции.
public: void XMLUpdate(String^ Location, int NumberItems, String^ ProjectName,
String^ ProjectTC, String^ CurrentFile, String^ CurrentHash)
{
try
{
XmlDocument^ XmlDoc = gcnew XmlDocument();
XmlDoc->Load(Location);
XmlElement^ NewProject = XmlDoc->CreateElement("Project");
NewProject->SetAttribute("Name", ProjectName);
XmlDoc->DocumentElement->AppendChild(NewProject);
XmlElement^ NewTestCycle = XmlDoc->CreateElement("TestCycle");
NewTestCycle->SetAttribute("Number", ProjectTC);
NewProject->AppendChild(NewTestCycle);
XmlElement^ NewFile = XmlDoc->CreateElement("Files");
NewTestCycle->AppendChild(NewFile);
for (int x = 0; x < NumberItems; ++x)
{
String^ FileName = CurrentFile;
String^ Hash = CurrentHash;
XmlElement^ NewFileName = XmlDoc->CreateElement("FileName");
NewFileName->SetAttribute("File", FileName);
NewFile->AppendChild(NewFileName);
XmlElement^ NewHashCode = XmlDoc->CreateElement("HashCode");
NewHashCode->SetAttribute("Code", Hash);
NewFile->AppendChild(NewHashCode);
}
XmlDoc->Save(Location);
return;
}
catch(Exception^)
{
return;
}
}
Вызов метода:
private void button4_Click(object sender, RoutedEventArgs e)
{
DllTest.Funtions Functions = new DllTest.Funtions();
String Name = textBox1.Text;
String TC = textBox2.Text;
String path = "C:\\Users\\brandonm\\Desktop\\Backup\\XML\\test1.xml";
int Number = listBox2.Items.Count;
for (int x = 0; x < listBox2.Items.Count; ++x)
{
Functions.XMLNew(path, Name, TC, Number, listBox2.Items[x].ToString(),
listBox3.Items[x].ToString());
}
}
вывод для этого, который ближе к тому, что мне нужно, так как он использует все элементы в списке, но дублирует их в каждом элементе. Мне нужен только один новый элемент с новыми файлами и их хешами.
<?xml version="1.0" encoding="utf-8"?>
<Project Name="New">
<TestCycle Number="1">
<Files>
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
</Files>
</TestCycle>
</Project>
<Project Name="2">
<TestCycle Number="New">
<Files>
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\DllTest.dll" />
<HashCode Code="0E-C2-B1-A4-3C-D8-C0-51-96-0F-FF-19-BC-3A-CE-AC" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\DllTest.dll" />
<HashCode Code="0E-C2-B1-A4-3C-D8-C0-51-96-0F-FF-19-BC-3A-CE-AC" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\DllTest.dll" />
<HashCode Code="0E-C2-B1-A4-3C-D8-C0-51-96-0F-FF-19-BC-3A-CE-AC" />
</Files>
</TestCycle>
</Project>
<Project Name="2">
<TestCycle Number="New">
<Files>
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.exe" />
<HashCode Code="C0-7C-51-C2-92-70-1B-11-E0-26-6D-D5-B8-79-12-0D" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.exe" />
<HashCode Code="C0-7C-51-C2-92-70-1B-11-E0-26-6D-D5-B8-79-12-0D" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.exe" />
<HashCode Code="C0-7C-51-C2-92-70-1B-11-E0-26-6D-D5-B8-79-12-0D" />
</Files>
</TestCycle>
</Project>
<Project Name="2">
<TestCycle Number="New">
<Files>
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
<FileName File="C:\Users\brandonm\Documents\Visual Studio 2008\Projects\WpfDllTest\WpfDllTest\bin\x86\Release\WpfDllTest.vshost.exe" />
<HashCode Code="76-7B-6F-37-0D-3A-F2-F4-32-D1-70-A5-75-3B-DE-95" />
</Files>
</TestCycle>
</Project>
</Project>
Итак, теперь вы можете увидеть проблему, у меня есть циклы внутри циклов, вызывающие вывод, который повторяется сам. Я могу опубликовать пример моего вывода, если вам нужно.
Но ради жизни я не могу обойти это, я пытался разделить функции на части, но я получаю ошибки, пытаясь это сделать.
Кто-нибудь может найти способ обойти это? Я только хочу полностью переписать методы в c #, если это моя единственная альтернатива, так как я хочу, чтобы все основные функции в dll. Пожалуйста, не ругайте меня за недостаток знаний, я все еще учусь и впервые проверяю многие вещи.
Спасибо