Fortran Coder

查看: 1883|回复: 11
打印 上一主题 下一主题

[求助] C#与fortran混编调用不了dll

[复制链接]

25

帖子

5

主题

0

精华

熟手

F 币
129 元
贡献
60 点
跳转到指定楼层
楼主
发表于 2024-5-14 11:06:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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);
        }
    }
}


分享到:  微信微信
收藏收藏1 点赞点赞 点踩点踩

25

帖子

5

主题

0

精华

熟手

F 币
129 元
贡献
60 点
沙发
 楼主| 发表于 2024-5-14 11:33:47 | 只看该作者
对了,编译器的是vs2022+oneapi

260

帖子

0

主题

0

精华

版主

World Analyser

F 币
721 元
贡献
512 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
板凳
发表于 2024-5-14 16:48:29 | 只看该作者
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);
    }
}

25

帖子

5

主题

0

精华

熟手

F 币
129 元
贡献
60 点
地板
 楼主| 发表于 2024-5-15 10:03:52 | 只看该作者
kyra 发表于 2024-5-14 16:48
Fortran 这边用以下代码,这样,这个dll就和C语言完全一模一样了:
[mw_shl_code=fortran,true]Subroutine  ...

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

260

帖子

0

主题

0

精华

版主

World Analyser

F 币
721 元
贡献
512 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
5#
发表于 2024-5-15 10:17:38 | 只看该作者
1468592801 发表于 2024-5-15 10:03
fortran那块发生报错了,加的bind和type(c_ptr)都编译不了

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

25

帖子

5

主题

0

精华

熟手

F 币
129 元
贡献
60 点
6#
 楼主| 发表于 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
我这样写就好了,请问这样写是可以的吗

25

帖子

5

主题

0

精华

熟手

F 币
129 元
贡献
60 点
7#
 楼主| 发表于 2024-5-15 11:09:45 | 只看该作者
kyra 发表于 2024-5-15 10:17
用的什么编译器?截图看看错误提示

用的编译器的vs2022+oneapi

260

帖子

0

主题

0

精华

版主

World Analyser

F 币
721 元
贡献
512 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
8#
发表于 2024-5-15 13:32:12 | 只看该作者
1468592801 发表于 2024-5-15 11:04
subroutine mainsolve(projectnamec) bind(C, name='mainsolve')
      !DEC$ATTRIBUTES DLLEXPORT ...

这样写的话,你的 projectname 长度只有1
截图给错误提示。这是求助问题的基本信息

25

帖子

5

主题

0

精华

熟手

F 币
129 元
贡献
60 点
9#
 楼主| 发表于 2024-5-15 14:58:40 | 只看该作者
kyra 发表于 2024-5-15 13:32
这样写的话,你的 projectname 长度只有1
截图给错误提示。这是求助问题的基本信息 ...

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

260

帖子

0

主题

0

精华

版主

World Analyser

F 币
721 元
贡献
512 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
10#
发表于 2024-5-15 21:49:07 | 只看该作者
dlllose.w.fcode.cn 可能对你有帮助
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-23 17:40

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表