Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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# 罗伯特·吉塞克';s非托管导出-输出字符串_C#_Unmanagedexports - Fatal编程技术网

C# 罗伯特·吉塞克';s非托管导出-输出字符串

C# 罗伯特·吉塞克';s非托管导出-输出字符串,c#,unmanagedexports,C#,Unmanagedexports,我正在从VBA工作到.NET。 我有一个使用CLI和stdcall的界面的工作版本 我试图删除对C++ 2015运行时的依赖性,看起来我可以使用unMeaveExtPosits来做它。 但我有几个问题 我可以用“ref string”作为参数并让它工作吗 如果是,我可以用“out string”替换它吗 在这两种情况下,我是否必须进行任何字符串/字符串长度管理 我目前以“int”的形式传递了几个回调。从我在别处看到的一个例子来看,在C#端,使用这个函数,我应该能够用Func替换回调函数的那些参数

我正在从VBA工作到.NET。 我有一个使用CLI和stdcall的界面的工作版本

<>我试图删除对C++ 2015运行时的依赖性,看起来我可以使用unMeaveExtPosits来做它。 但我有几个问题

  • 我可以用“ref string”作为参数并让它工作吗
  • 如果是,我可以用“out string”替换它吗
  • 在这两种情况下,我是否必须进行任何字符串/字符串长度管理

  • 我目前以“int”的形式传递了几个回调。从我在别处看到的一个例子来看,在C#端,使用这个函数,我应该能够用Func替换回调函数的那些参数,比如函数a(p1为String,p2为Long,p3为String)


  • 任何建议都将不胜感激。

    您需要结合使用strprtr,可能是访问端的StrConv,以及.NET端的IntPtr:

            'VBA7    
            Private Declare PtrSafe Function Command Lib "External.dll" (ByVal CommandName As String, ByVal Result As LongPtr, ByRef ResultLength As Long) As Long
            'VBA pre7
                Private Declare Function Command Lib "External.dll" (ByVal CommandName As String, ByVal Result As Long, ByRef ResultLength As Long) As Long
    
    'Example to use.
    'Result will be up to "i" characters - no new string involved
                Dim i As Long, x As Long, strResult As String
                i = 100
                strResult = Space(i)
                x = Command(CommandName, Arguments, StrPtr(strResult), i)
    
    如果使用StrConv,字符串类型由您决定。否则,指针将指向Unicode数组

    C侧:


    这不是正确的方法。在C语言中返回字符串不可避免地会带来严重的内存管理问题。VBA非常非常喜欢在代码中使用[ComVisible(true)]。@HansPassant除了我明确避免COM注册的要求,因为我需要XCOPY部署。这就是为什么我还希望避免C++ 2015运行时依赖性。ptrtoStrununi和编码。Unicode依赖于正在使用的字符串类型。
        [DllExport("Command", CallingConvention.StdCall)]
        public static int Command(string commandName, string arguments, IntPtr result, out /*or ref*/ int resultLength)
    {
           string inputStr = Marshal.PtrToStringUni(result); //Unicode
           resultLength = inputStr.Length;
           int x = MainFunc.Command(commandName, arguments, ref inputStr);
           if(null == inputStr)
           {
                inputStr = "";
           }
           if(inputStr.Length > resultLength)
           {
                inputStr = inputStr.Substring(0, resultLength);
            }
            byte[] outputBytes = Encoding.Unicode.GetBytes(inputStr);
            Marshal.Copy(outputBytes, 0, result, outputBytes.Length);
            resultLength = inputStr.Length;
            return x;
        }