【问题标题】:Embed a win32 dll in .net Project在.net项目中嵌入一个win32 dll
【发布时间】:2014-02-18 16:28:35
【问题描述】:

是否可以将 win32 .dll 嵌入到 .net 项目中?理想情况下,我不想将 .dll 与 .exe 一起分发。我已经阅读了有关将 AssemblyReslove 用于 .net dll (here) 的信息,但它似乎不适用于我的 .dll(使用 Intel Fortran 编译器创建)。首先,事件“AppDomain.CurrentDomain.AssemblyResolve”永远不会被调用。但是,即使我在使用 .dll 之前强制加载程序集,我也会收到以下错误:

在 mscorlib.dll 中发生了“System.BadImageFormatException”类型的未处理异常。
附加信息:无法加载文件或程序集“从 DLLtest2 加载的 16896 字节,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = null”或其依赖项之一。试图加载格式不正确的程序。

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

用于装配加载的代码:

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

谢谢!

【问题讨论】:

  • Assembly.Load 仅加载 .Net 程序集。如果它不是 .Net 程序集,则不会加载它
  • 谢谢谢尔盖,我担心可能是这样!知道如何/是否可以使用不同的技术加载非 .net 程序集?

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


【解决方案1】:

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

给定以下 (Intel) 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”),但我建议将其并排放置以减少混淆。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2010-11-14
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多