在.net项目中嵌入win32 dll

时间:2014-02-18 16:28:36

标签: .net dll fortran embed .net-assembly

是否可以将win32 .dll嵌入到.net项目中?理想情况下,我不想分发.dll和.exe。我已经阅读过使用AssemblyReslove for .net dll(here),但它似乎不适用于我的.dll(使用英特尔Fortran编译器创建)。首先,永远不会调用事件“AppDomain.CurrentDomain.AssemblyResolve”。但是,即使我在使用.dll之前强制组装,我也会收到以下错误:

  

mscorlib.dll中出现未处理的“System.BadImageFormatException”类型异常。
  附加信息:无法加载从DLLtest2,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'或其依赖项之一加载的文件或程序集“16896字节”。试图加载格式不正确的程序。

任何想法我可能做错了 - 或者我可以尝试的其他方法?

用于装配加载的代码:

using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("DLLtest2.Dll1.dll"))
{
   byte[] assemblyData = new byte[stream.Length];
   stream.Read(assemblyData, 0, assemblyData.Length);
   Assembly.Load(assemblyData);
}

谢谢!

2 个答案:

答案 0 :(得分:1)

Assembly.Load仅适用于.NET(托管)程序集。对于本机DLL,您需要使用PInvoke。

鉴于以下(英特尔)Fortran子程序:

subroutine DoWork(n, A)
    !DEC$ ATTRIBUTES DLLEXPORT :: DoWork
    !DEC$ ATTRIBUTES ALIAS: 'DoWork' :: DoWork
    !DEC$ ATTRIBUTES REFERENCE :: n, A
    integer, intent(in) :: n
    real(8), dimension(n, n), intent(inout) :: A
end subroutine

在C#代码中使用以下方法签名。

[DllImport("FortranStuff.dll", EntryPoint = "DoWork", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern void DoWork(ref int n, [In, Out] double[,] A);

在此示例中,FortranStuff.dll需要与调用程序集位于同一目录中。你可以修改属性以使用相对或绝对文件路径(“.. \ bin \ FortranStuff.dll”),但我建议只是将它并排放置以减少混淆。

答案 1 :(得分:0)

我不这么认为!它们必须在编译时间链接!如果你嵌入你的程序,我认为反编译并保存dll

可以很简单