как вернуть байтовый массив, значение uint из c # dll, dll, вызванное c ++ / cli

1

Я пишу aС# DLL, который будет вычислять и производить: -

-byte array [byte array]
-unit       [2 byte error code]
-bool       [true/false for success and failure]

эта функция будет вызвана проектом C++/CLI. Функция может возвращать только одно значение, но мне нужны эти 3 значения после выполнения функции С#.

какой будет прототип функции в С# и как он вызывается кодом C++/CLI.

заранее спасибо

  • 2
    Просто напишите метод, который возвращает байт []. Это array<Byte>^ в C ++ / CLI. «Коды ошибок» должны быть исключениями.
  • 0
    @HansPassant: Это действительно зависит от того, ожидается ли сбой или нет. Например, при разборе ввода внешних данных неверный ввод не является на самом деле исключением.
Теги:
c++-cli

3 ответа

1
Лучший ответ

Может быть, вы можете использовать out модификатора.

void MyMethod(out byte[] ba, out short code, out bool success)
{
    ...
}

Как говорят здесь, вызов будет:

array<System::Byte>^ ba;
Int16 code;
bool success;
MyClass::MyMethod(ba, code, success);

Я просто протестировал его. Надеюсь, поможет.

  • 0
    Стоит упомянуть шаблон TryXXX ( TryParse , Dictionary<Key,Value>::TryGetValue т. Д.), Dictionary<Key,Value>::TryGetValue делает это, за исключением того, что bool success становится возвращаемым значением.
  • 0
    Я использовал ссылку, и она работает хорошо. public bool READ_KEY (ref uint errorcode, ref byte [] temp, ref uint array_length)
3

Попробуйте вернуть структуру или класс этих элементов.

0

Как отметил Ханс Пассант в комментариях, ошибки должны быть исключениями, а не частью возвращаемого значения. Если у вас возникли проблемы с синтаксисом, вот что я буду делать:

В С#:

public class CSharpClass
{
    public static byte[] Foo()
    {
        // ...
        if (some error condition)
        {
            throw new SomeException(...); 
            // If you really want, write your own exception class
            // and have the error code be a property there.
        }

        byte[] result = new byte[1024];
        return result;
    }
}

В C++/CLI:

public ref class CppCLIClass
{
public:
    static void Bar()
    {
        try
        {
            array<Byte>^ fooResult = CSharpClass::Foo();
            // Success, no error occurred.
        }
        catch (SomeException^ e)
        {
            // An error occurred.
        }
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню