是否可以将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);
}
谢谢!
答案 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
可以很简单