【问题标题】:Consuming FORTRAN DLL in C# via COM (P/invoke)通过 COM (P/invoke) 在 C# 中使用 FORTRAN DLL
【发布时间】:2012-08-16 19:05:18
【问题描述】:

我目前正在尝试使用第三方提供的 FORTRAN DLL。现在,它已经被其他供应商使用过(不确定他们是否使用 C# 来使用它),但是我在尝试使用它时遇到了一些参考错误。

我基本上是想让它在一个小型测试应用程序中工作。

这是我用来导入的 C# 代码(实际上是基本 COM):

[DllImport("foo.dll")]
public static extern void foo(ref int IS, ref double[] BETA, ref int K, out double TH, out double SETH, out int IER);

static void Main(string[] args)
{
    double[] betas = new double[3];
    betas[0] = 25.6;
    betas[1] = 30.8;
    betas[2] = 35.8;

    int score = 5;
    int numberOfItems = 3;
    double latentVariable;
    double standardErrorOfEstimate;
    int errorCode;

    foo(ref score, ref betas, ref numberOfItems, out latentVariable, out standardErrorOfEstimate, out errorCode);

        Console.ReadLine();
}

注意:DLL 方法签名与我所拥有的匹配。

尝试运行应用程序时,我收到以下异常:

无法加载 DLL 'foo.dll':应用程序无法启动,因为它的并排配置不正确。请查看应用程序事件日志或使用命令行 sxstrace.exe 工具了解更多详细信息。 (HRESULT 异常:0x800736B1)

查看事件日志,错误中显示以下详细信息:

“C:\dllpath\foo.dll”的激活上下文生成失败。相关程序集 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8" 找不到。详细诊断请使用sxstrace.exe。

另外,运行 sxstrace,显示相同的信息和错误:

错误:无法解析引用 Microsoft.VC90.DebugCRT、processorArchitecture="x86"、publicKeyToken="1fc8b3b9a1e18e3b"、type="win32"、version="9.0.21022.8"。 错误:激活上下文生成失败。 结束激活上下文生成。

现在,在进行了一些谷歌搜索并查看了这里之后,有些人建议安装 C++ 的可再发行包。我在 2008 年和 2010 年都在 x86 和 x64 平台上做到了这一点,但仍然没有乐趣。

有人有什么想法吗?我正在使用 Visual Studio 2010 和 Windows 7(如果有帮助?)。

【问题讨论】:

  • 一个小的修正 DllImport 是 pinvoke 而不是 Com 互操作。 msdn.microsoft.com/en-us/library/ms173185.aspx
  • @AmitMittal 更新了标签和标题,谢谢 :)
  • 不要为数组添加 ref 关键字。它们已经是参考。仅将 ref 关键字添加到原始值。
  • 您能否发布FORTRAN 函数声明以及参数和类型。

标签: c# com pinvoke fortran


【解决方案1】:

问题是 DebugCRT。您已经获得了该 DLL 的调试版本,并且它依赖于 CRT 的调试版本。这需要适当版本的 Visual Studio,这是在您的计算机上获取 CRT 调试版本的唯一方法。即 Visual Studio 2008,由 9.0 版本号表示。如果您还没有此 DLL 的源代码,则无法使用调试版本。您也无法在客户的机器上部署并运行此 DLL。

通过联系所有者并要求发布构建以使可再分发包可以工作,从而取得成功。

【讨论】:

  • 谢谢汉斯,我想你已经赢了,只是等待安装 VS2008 :)
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多