Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中编组简单字符串#_C#_C++_.net 4.0_Pinvoke - Fatal编程技术网

C# 在C语言中编组简单字符串#

C# 在C语言中编组简单字符串#,c#,c++,.net-4.0,pinvoke,C#,C++,.net 4.0,Pinvoke,我完全没有通过这个非常简单的p/Invoke [System.Runtime.InteropServices.DllImport( "temp.dll" )] private static extern System.IntPtr parser_alloc(); [System.Runtime.InteropServices.DllImport( "temp.dll", CharSet = System.Runt

我完全没有通过这个非常简单的p/Invoke

    [System.Runtime.InteropServices.DllImport(
        "temp.dll"
    )]
    private static extern System.IntPtr parser_alloc();

    [System.Runtime.InteropServices.DllImport(
        "temp.dll", 
        CharSet = System.Runtime.InteropServices.CharSet.Ansi
    )]
    private static extern void parser_add_file(
        System.IntPtr p,
        [MarshalAs(UnmanagedType.LPStr)]string f,
        [MarshalAs(UnmanagedType.LPStr)]string s);

    [System.Runtime.InteropServices.DllImport(
        "temp.dll"
    )]
    private static extern void parser_free(
        System.IntPtr p);

    [System.Runtime.InteropServices.DllImport(
        "temp.dll"
    )]
    private static extern void parser_emit_results(
        System.IntPtr p);

    [System.Runtime.InteropServices.DllImport(
        "temp.dll",
        CharSet = System.Runtime.InteropServices.CharSet.Ansi
    )]
    private static extern void parser_file_updated(
        System.IntPtr p,
        [MarshalAs(UnmanagedType.LPStr)]string f,
        int offset,
        int added);
创建对象似乎进展顺利。但是,当我尝试调用parser_add_file时,运行时会告诉我有一个不匹配的签名。这是我现有的C++代码:

class Parser {
public:
    void add_file(std::string filename, std::string source) {
        std::cout << "add_file | " << filename << " | " << source << "\n";
    }
    void clear_contents() {
        std::cout << "clear_contents\n";
    }
    void emit_results() {
        std::cout << "emit_results\n";
    }
    void file_updated(std::string filename, int offset, int added) {
        std::cout << "file_updated | " << filename << " | " << offset << " | " << added << "\n";
        // added should be negative to signify removing
    }
    Parser() {
        std::cout << "I made a Parser!\n";
    }
};

extern "C" __declspec(dllexport) Parser* parser_alloc() {
    return new Parser;
};

extern "C" __declspec(dllexport) void parser_add_file(Parser* p, const char* filename, const char* string) {
    p->add_file(filename, string);
}

extern "C" __declspec(dllexport) void parser_free(Parser* p) {
    delete p;
}

 extern "C" __declspec(dllexport) void parser_emit_results(Parser* p) {
    p->emit_results();
}

 extern "C" __declspec(dllexport) void parser_file_updated(Parser* p, const char* filename, int offset, int added) {
    p->file_updated(filename, offset, added);
}
类解析器{
公众:
void add_文件(std::string文件名,std::string源){

STD::CUT

原来我手动设置了调用约定为CDDEL——默认是STDCLAN.< /P> > P>如果您有访问C++源的能力(看起来像您这样做),您也可以在C++声明级别更改调用约定。这里是我所写的库的示例函数:

int _stdcall GeoConvertLatLongToUTM(double latitude, double longitude, char *szOutput)