Fortran Coder

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

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

[复制链接]

15

帖子

3

主题

0

精华

入门

F 币
88 元
贡献
38 点
跳转到指定楼层
楼主
发表于 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 点赞点赞 点踩点踩

15

帖子

3

主题

0

精华

入门

F 币
88 元
贡献
38 点
12#
 楼主| 发表于 2024-5-16 12:23:54 | 只看该作者
1468592801 发表于 2024-5-16 11:43
非常感谢,看了帖子之后我发现原来还是缺少依赖的dll,加上了之后就可以了,现在还有的一个小问题是传递 ...

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

15

帖子

3

主题

0

精华

入门

F 币
88 元
贡献
38 点
11#
 楼主| 发表于 2024-5-16 11:43:00 | 只看该作者
kyra 发表于 2024-5-15 21:49
dlllose.w.fcode.cn 可能对你有帮助

非常感谢,看了帖子之后我发现原来还是缺少依赖的dll,加上了之后就可以了,现在还有的一个小问题是传递参数的时候本来应该是try的,传过来之后变成try后面加了一堆乱码

258

帖子

0

主题

0

精华

版主

World Analyser

F 币
713 元
贡献
508 点

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

QQ
10#
发表于 2024-5-15 21:49:07 | 只看该作者
dlllose.w.fcode.cn 可能对你有帮助

15

帖子

3

主题

0

精华

入门

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

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

258

帖子

0

主题

0

精华

版主

World Analyser

F 币
713 元
贡献
508 点

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

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
截图给错误提示。这是求助问题的基本信息

15

帖子

3

主题

0

精华

入门

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

用的编译器的vs2022+oneapi

15

帖子

3

主题

0

精华

入门

F 币
88 元
贡献
38 点
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
我这样写就好了,请问这样写是可以的吗

258

帖子

0

主题

0

精华

版主

World Analyser

F 币
713 元
贡献
508 点

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

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

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

15

帖子

3

主题

0

精华

入门

F 币
88 元
贡献
38 点
地板
 楼主| 发表于 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)都编译不了
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-6-27 22:57

Powered by Tencent X3.4

© 2013-2024 Tencent

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