使用从D导出的DLL

Sas*_*zem 6 python dll d

我在D中创建了一个简单的加密程序,我有想法从中创建一个DLL并尝试将其导入到例如Python中.

我可以简单地调用我的main函数,因为它不需要任何参数.但是当我使用我的加密方法时,它使用动态长度ubyte[]数组,但据我所知,它们不存在于其他基于C/C++的语言中.

例如,我的一个函数的第一行:
ubyte[] encode(ubyte[] data, ubyte[] key){

但是我不能在没有固定长度的情况下使用其他语言的数组!如何导入该函数,例如,在Python中?

编辑:

我知道我可以创建一个包含指针和数组长度的包装器,但是不是更优雅的解决方案吗?
(我不需要使用D来使用用D编写的lib)

Bau*_*uss 1

好吧,说实话。除了用长度包装指针或包装到 C 数组然后包装到 D 之外,没有真正优雅的方法。

但是,您可以使用第一种方法来实现一个稍微优雅的目的,使用具有指针、长度和将其转换为 D 数组的属性的结构。

然后,您导出的函数采用您的结构,该函数应该做的就是调用一个采用实际 D 数组的内部函数,您只需将数组传递给它,此时就会通过别名 this 和转换属性进行转换。

示例用法如下: module main;

import core.stdc.stdlib : malloc;

import std.stdio;

struct DArray(T) {
    T* data;
    size_t length;
    /// This field can be removed, only used for testing purpose
    size_t offset;

    @property T[] array() {
        T[] arr;

        foreach(i; 0 .. length) {
            arr ~= data[i];
        }

        return arr;
    }

    alias array this;

    /// This function can be removed, only used for testing purpose
    void init(size_t size) {
        data = cast(T*)malloc(size * T.sizeof);
        length = size;
    }

    /// This function can be removed, only used for testing purpose
    void append(T value) {
        data[offset] = value;

        offset++;
    }
}

// This function is the one exported
void externalFoo(DArray!int intArray) {
    writeln("Calling extern foo");

    internalFoo(intArray);
}

// This function is the one you use
private void internalFoo(int[] intArray) {
    writeln("Calling internal foo");

    writeln(intArray);
}


void main() {
    // Constructing our test array
    DArray!int arrayTest;
    arrayTest.init(10);

    foreach (int i; 0 .. 10) {
        arrayTest.append(i);
    }

    // Testing the exported function 
    externalFoo(arrayTest);
}
Run Code Online (Sandbox Code Playgroud)

这是如何做到这一点的绝对最低版本

struct DArray(T) {
    T* data;
    size_t length;

    @property T[] array() {
        T[] arr;

        foreach(i; 0 .. length) {
            arr ~= data[i];
        }

        return arr;
    }

    alias array this;

}

// This function is the one exported
void externalFoo(DArray!int intArray) {
    writeln("Calling extern foo");

    internalFoo(intArray);
}

// This function is the one you use
private void internalFoo(int[] intArray) {
    writeln("Calling internal foo");

    writeln(intArray);
}
Run Code Online (Sandbox Code Playgroud)