Использование предварительно скомпилированного блока.NET DLL в моно?

Вот простой метод, который объединит два массива и вернет результат:

public <T> T[] concatenate(T[] a, T[] b) {
    int aLen = a.length;
    int bLen = b.length;

    @SuppressWarnings("unchecked")
    T[] c = (T[]) Array.newInstance(a.getClass().getComponentType(), aLen + bLen);
    System.arraycopy(a, 0, c, 0, aLen);
    System.arraycopy(b, 0, c, aLen, bLen);

    return c;
}

Обратите внимание, что он не будет работать с примитивными типами данных, только с типами объектов.

Следующая немного более сложная версия работает как с объектными, так и с примитивными массивами. Он делает это, используя T вместо T[] в качестве типа аргумента.

Это также позволяет объединять массивы двух разных типов, выбирая наиболее общий тип в качестве типа компонента результата.

public static <T> T concatenate(T a, T b) {
    if (!a.getClass().isArray() || !b.getClass().isArray()) {
        throw new IllegalArgumentException();
    }

    Class<?> resCompType;
    Class<?> aCompType = a.getClass().getComponentType();
    Class<?> bCompType = b.getClass().getComponentType();

    if (aCompType.isAssignableFrom(bCompType)) {
        resCompType = aCompType;
    } else if (bCompType.isAssignableFrom(aCompType)) {
        resCompType = bCompType;
    } else {
        throw new IllegalArgumentException();
    }

    int aLen = Array.getLength(a);
    int bLen = Array.getLength(b);

    @SuppressWarnings("unchecked")
    T result = (T) Array.newInstance(resCompType, aLen + bLen);
    System.arraycopy(a, 0, result, 0, aLen);
    System.arraycopy(b, 0, result, aLen, bLen);        

    return result;
}

Вот пример:

Assert.assertArrayEquals(new int[] { 1, 2, 3 }, concatenate(new int[] { 1, 2 }, new int[] { 3 }));
Assert.assertArrayEquals(new Number[] { 1, 2, 3f }, concatenate(new Integer[] { 1, 2 }, new Number[] { 3f }));
13
задан NickAldwin 19 August 2009 в 14:14
поделиться

4 ответа

Я бы протестировал DLL с помощью MOMA (Mono Migration Analyzer) , чтобы убедиться, что он использует неподдерживаемые API.

9
ответ дан 1 December 2019 в 21:53
поделиться

Вероятные проблемы заключаются в том, что сборка не помещается в тот же каталог, что и программа, или что чувствительность к регистру имя файла сборки не сохраняется при его копировании. Например, у вас может быть ссылка OUR.ASSEMLY, но имя файла - OurAssembly.DlL или любая другая недопустимая комбинация регистров, которую могут придумать люди.

4
ответ дан 1 December 2019 в 21:53
поделиться

Обычно вы можете получить более подробную информацию об ошибках загрузки .dll, запустив:

MONO_LOG_LEVEL = "debug" MONO_LOG_MASK = "dll" mono myapp.exe

4
ответ дан 1 December 2019 в 21:53
поделиться

То, что сказал Джонатан, верно, вам нужно запустить команду, как показано, и она выдаст огромное количество информации.

Сборка имеет строгое имя, поэтому похоже, что в Windows у вас есть зависимость, установленная на GAC. Если "OUR.ASSEMBLY" должен быть там, запустите:

gacutil -i OUR.ASSEMBLY.dll

Чтобы установить его. Могут быть и другие зависимости, которые нужны OUR.ASSEMBLY.dll, что покажет команда JPobst.

6
ответ дан 1 December 2019 в 21:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: