【发布时间】:2020-02-11 12:04:46
【问题描述】:
我正在我的 Dotnet core 3.1 应用程序中加载一个 c++ 程序集。
如果我使用 DllImport,我可以按预期加载和使用程序集。
[DllImport(
"lib/mylibrary.dll",
CallingConvention = CallingConvention.Cdecl,
EntryPoint = "MyEndpoint"
)]
但是,我想为平台、windows 或 linux 选择合适的库。我尝试使用 System.Reflection.Assembly.LoadFrom 动态加载 DLL,但这给出了错误 Bad IL Format。
我尝试了几种不同的方法,但都给出了相同的错误
// 读取字节
var bytes = File.ReadAllBytes("lib/myLibrary.dll");
var assembly = System.Reflection.Assembly.Load(bytes); //bad IL format
// 加载自
var assembly = System.Reflection.Assembly.LoadFrom("lib/myLibrary.dll"); //bad IL format
//从汇编路径加载
var assembly = System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromAssemblyPath("lib/myLibrary.dll"); //bad IL format
//来自嵌入资源
var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("my-library.manifestname.dll");
var assembly System.Runtime.Loader.AssemblyLoadContext.Default.LoadFromStream(stream); //bad IL format
我在这里做错了什么?
编辑:
解决方案:
static class MyWrapper
{
static MyWrapper {
// The linked solution suggests setting the dll path using kernel32, this only works for windows. Set Environment.CurrentDirectory instead.
if(RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Environment.CurrentDirectory = "lib/windows";
}
else
{
Environment.CurrentDirectory = "lib/unix";
}
}
...
[DllImport(
"my_library", //IMPORTANT: drop the extension to preserve compatibility between dylib, dll, so, etc.
CallingConvention = CallingConvention.Cdecl,
EntryPoint = "MyEntryPoint"
)]
}
【问题讨论】:
-
你有一个本地 DLL,而不是一个 .Net 程序集。
-
@GSerg facepalm 我想该喝杯咖啡了。我会那个解决方案,看起来应该有帮助