Создание методов в C ++ Dll для импорта в C # - PullRequest
1 голос
/ 13 июня 2011

Пройдя несколько небольших курсов и немного используя WPF и C #, я решил переписать приложение, над которым я работал. У меня большинство функций отлично работают в C ++ DLL, которую я создал и импортировал в мое приложение WPF.

Хотя у меня проблемы с некоторыми из них. Здесь я ранее передавал переменные из других функций или использовал диалоги и ящики сообщений.

Вот пример одной из функций C ++, которую мне нужно поместить в DLL. Функция генерирует хэш-код MD5 для списка файлов в списке, которые были добавлены с помощью OpenFileDialog.

array<Byte>^ Hash()
{
    array<Byte>^ Buffer = nullptr;
    int x = 0;
    for each(String^ Files in listBox2->Items)
    {
        try
        {
            IO::FileStream^ FileStream = gcnew IO::FileStream(Files, IO::FileMode::Open, IO::FileAccess::Read);

            IO::BinaryReader^ BinaryReader = gcnew IO::BinaryReader(FileStream);

            IO::FileInfo^ FileInfo = gcnew IO::FileInfo(Files);

            System::Int64 TotalBytes = FileInfo->Length;

            Buffer = BinaryReader->ReadBytes(safe_cast<System::Int32>(TotalBytes));

            FileStream->Close();
            delete FileStream;
            BinaryReader->Close();

            MD5^ md5 = gcnew MD5CryptoServiceProvider;

            array<Byte>^ Hash = md5->ComputeHash(Buffer);

            String^ FileHex = BitConverter::ToString(Hash);

            listBox3->Items->Add(FileHex);

            x = x + 1;
        }
        catch(Exception^ e)
        {
            MessageBox::Show(e->Message->ToString());
            listBox1->Items->RemoveAt(listBox1->SelectedIndex);
        }
    }
    return Buffer;
}

Этот код прекрасно работает в моем приложении C ++, которое я сделал. Так что я попытался сделать все, что было в выражении try, и использовать его в качестве кода для метода, однако моя проблема возникла в первой строке, где очевидно, что «Files» является переменной, или, по крайней мере, я думаю, что именно в этом проблема.

Есть ли способ, которым я все еще могу использовать этот код как есть, создать переменную в C # и затем передать ее этому методу?

Я попытался сделать это, используя следующий код в моем приложении C #

private void button2_Click(object sender, RoutedEventArgs e)
{
    DllTest.Funtions Functions = new DllTest.Funtions();

    foreach (String Files in listBox1.Items)
    {
        String File = Files;
        File = Functions.HashFunction();

        listBox2.Items.Add(File);
    }
}

Однако, когда я запускаю приложение, я получаю только те сообщения перехвата, которые появляются в списке. это ошибка в компиляторе, когда я использую метод "Первое случайное исключение типа 'System.ArgumentNullException' произошло в mscorlib.dll"

В любом случае, я могу сделать это без переписывания метода в C #?

Извините, если мой код не самый лучший, я все еще новичок в C ++ и C #

Ответы [ 2 ]

2 голосов
/ 13 июня 2011

Посоветовавшись с моим психическим отладчиком, я решил, что вы хотите это в C ++ / CLI:

    String^ HashFunction(String^ filename)
    {
        array<Byte>^ Buffer = IO::File::ReadAllBytes(filename);
        array<Byte>^ Hash = MD5CryptoServiceProvider().ComputeHash(Buffer);
        return BitConverter::ToString(Hash);
    }

и это в C #:

private void button2_Click(object sender, RoutedEventArgs e)
{
    foreach (String filename in listBox1.Items)
    {
        try {
            listBox2.Items.Add(Functions.HashFunction(filename));
        }
        catch (Exception ex) {
            MessageBox.Show(e.Message);
        }
    }
}

Но мой психический отладчик часто дает сбой.

1 голос
/ 13 июня 2011
String File = Files;
File = Functions.HashFunction();

Приведенный выше код не имеет никакого смысла.

...