Fortran Coder

标题: C#与fortran混编调用不了dll [打印本页]

作者: 1468592801    时间: 2024-5-14 11:06
标题: C#与fortran混编调用不了dll
本帖最后由 kyra 于 2024-5-14 16:00 编辑

用C#调用fortran的dll,传递的参数只有一个字符串,但就是死活调用不起来,有哪个大神知道这是怎么回事吗fortran:
[Fortran] 纯文本查看 复制代码
subroutine mainsolve(projectname)
!DEC$ATTRIBUTES DLLEXPORT :: mainsolve
!DEC$ ATTRIBUTES ALIAS:'mainsolve'::mainsolve
use, intrinsic :: ISO_C_BINDING
implicit none

character*16 :: projectname

...
end subroutine


C#:
[C#] 纯文本查看 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace cstest
{
    class FortranMethod
    {
        [DllImport("softplatdll.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern void mainsolve(ref string a);
        static void Main(string[] args)
        {
            string a = "try";
            mainsolve(ref a);
        }
    }
}



作者: 1468592801    时间: 2024-5-14 11:33
对了,编译器的是vs2022+oneapi
作者: kyra    时间: 2024-5-14 16:48
Fortran 这边用以下代码,这样,这个dll就和C语言完全一模一样了:
[Fortran] 纯文本查看 复制代码
Subroutine mainsolve(cprojectname) Bind(C,Name="mainsolve")
!DEC$ATTRIBUTES DLLEXPORT :: mainsolve
  use, intrinsic :: ISO_C_BINDING
  implicit none
  type(c_ptr) , value :: cprojectname
  character(len=16) , pointer :: projectname
  call c_f_pointer( cprojectname , projectname )
end subroutine mainsolve


C#这边我不太懂。AI 给出的答案,不一定对:
[C#] 纯文本查看 复制代码
using System;
using System.Runtime.InteropServices;

class Program {
    [DllImport("softplatdll.dll", CallingConvention = CallingConvention.Cdecl)]
    public static extern void mainsolve([MarshalAs(UnmanagedType.LPStr)] string str);

    static void Main() {
        // 调用DLL中的函数
        string a = "try";
        mainsolve(a);
    }
}

作者: 1468592801    时间: 2024-5-15 10:03
kyra 发表于 2024-5-14 16:48
Fortran 这边用以下代码,这样,这个dll就和C语言完全一模一样了:
[mw_shl_code=fortran,true]Subroutine  ...

fortran那块发生报错了,加的bind和type(c_ptr)都编译不了
作者: kyra    时间: 2024-5-15 10:17
1468592801 发表于 2024-5-15 10:03
fortran那块发生报错了,加的bind和type(c_ptr)都编译不了

用的什么编译器?截图看看错误提示
作者: 1468592801    时间: 2024-5-15 11:04
kyra 发表于 2024-5-15 10:17
用的什么编译器?截图看看错误提示

      subroutine mainsolve(projectnamec) bind(C, name='mainsolve')
      !DEC$ATTRIBUTES DLLEXPORT :: mainsolve
      use, intrinsic :: ISO_C_BINDING
      implicit none
      
      character(kind = c_char), intent(in) :: projectname
我这样写就好了,请问这样写是可以的吗
作者: 1468592801    时间: 2024-5-15 11:09
kyra 发表于 2024-5-15 10:17
用的什么编译器?截图看看错误提示

用的编译器的vs2022+oneapi
作者: kyra    时间: 2024-5-15 13:32
1468592801 发表于 2024-5-15 11:04
subroutine mainsolve(projectnamec) bind(C, name='mainsolve')
      !DEC$ATTRIBUTES DLLEXPORT ...

这样写的话,你的 projectname 长度只有1
截图给错误提示。这是求助问题的基本信息
作者: 1468592801    时间: 2024-5-15 14:58
kyra 发表于 2024-5-15 13:32
这样写的话,你的 projectname 长度只有1
截图给错误提示。这是求助问题的基本信息 ...

不好意思,用你的可以编译,是我之前写错了,现在的情况就是C#加载不出来我的dll,感觉应该是有其他的fortran用的dll没添加进C#里,但具体是什么情况我也不清楚,网上说这个报错什么类型的都有
作者: kyra    时间: 2024-5-15 21:49
dlllose.w.fcode.cn 可能对你有帮助
作者: 1468592801    时间: 2024-5-16 11:43
kyra 发表于 2024-5-15 21:49
dlllose.w.fcode.cn 可能对你有帮助

非常感谢,看了帖子之后我发现原来还是缺少依赖的dll,加上了之后就可以了,现在还有的一个小问题是传递参数的时候本来应该是try的,传过来之后变成try后面加了一堆乱码
作者: 1468592801    时间: 2024-5-16 12:23
1468592801 发表于 2024-5-16 11:43
非常感谢,看了帖子之后我发现原来还是缺少依赖的dll,加上了之后就可以了,现在还有的一个小问题是传递 ...

没事了,我用c#输入字符串长度,然后让fortran的字符串只赋值一定长度的部分




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2