通过COM(P / invoke)在C#中使用FORTRAN DLL

时间:2012-08-21 12:25:59

标签: c# com pinvoke fortran

我目前正在尝试使用我第三方提供的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 ++安装Redistributable软件包。我已经在x86和x64平台上为2008和2010做了这个,但仍然没有乐趣。

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

1 个答案:

答案 0 :(得分:1)

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

通过联系所有者并要求发布版本以使可再发行组件可以正常工作来获得成功。