1468592801 发表于 2024-5-14 11:06:32

C#与fortran混编调用不了dll

本帖最后由 kyra 于 2024-5-14 16:00 编辑

用C#调用fortran的dll,传递的参数只有一个字符串,但就是死活调用不起来,有哪个大神知道这是怎么回事吗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#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace cstest
{
    class FortranMethod
    {
      
      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:47

对了,编译器的是vs2022+oneapi

kyra 发表于 2024-5-14 16:48:29

Fortran 这边用以下代码,这样,这个dll就和C语言完全一模一样了:
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 给出的答案,不一定对:
using System;
using System.Runtime.InteropServices;

class Program {
   
    public static extern void mainsolve( string str);

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

1468592801 发表于 2024-5-15 10:03:52

kyra 发表于 2024-5-14 16:48
Fortran 这边用以下代码,这样,这个dll就和C语言完全一模一样了:
Subroutine...

fortran那块发生报错了,加的bind和type(c_ptr)都编译不了

kyra 发表于 2024-5-15 10:17:38

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

用的什么编译器?截图看看错误提示

1468592801 发表于 2024-5-15 11:04:32

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:45

kyra 发表于 2024-5-15 10:17
用的什么编译器?截图看看错误提示

用的编译器的vs2022+oneapi

kyra 发表于 2024-5-15 13:32:12

1468592801 发表于 2024-5-15 11:04
subroutine mainsolve(projectnamec) bind(C, name='mainsolve')
      !DEC$ATTRIBUTES DLLEXPORT ...
这样写的话,你的 projectname 长度只有1
截图给错误提示。这是求助问题的基本信息

1468592801 发表于 2024-5-15 14:58:40

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

不好意思,用你的可以编译,是我之前写错了,现在的情况就是C#加载不出来我的dll,感觉应该是有其他的fortran用的dll没添加进C#里,但具体是什么情况我也不清楚,网上说这个报错什么类型的都有

kyra 发表于 2024-5-15 21:49:07

dlllose.w.fcode.cn 可能对你有帮助
页: [1] 2
查看完整版本: C#与fortran混编调用不了dll