c#:特定 dll 的 DLLImport 不工作,尽管示例应用程序显示它工作,我该如何解决这个问题?
c# : DLLImport for a particular dll not working, although an example app shows it working, How can i resolve this?
我正在尝试使用相对路径导入 dll
private const string LzoDll32Bit = @"lib32\lzo_32.dll";
#region Dll-Imports
[DllImport(LzoDll32Bit, EntryPoint = "lzo_version_string")]
private static extern IntPtr lzo_version_string32();
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_1_compress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_1_compress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_decompress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_decompress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "__lzo_init_v2", CallingConvention = CallingConvention.Cdecl)]
private static extern int __lzo_init_v2_32(uint v, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9);
#endregion
{"Unable to load DLL 'lib32\lzo_32.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)"}
奇怪的是,
http://wallaceturner.com/lzo-for-c,link 用于我下载示例项目以查看如何在 c#.net 中使用 lzo 压缩器的站点。
当我 运行 该项目成功运行时。除了我的项目中的依赖项之外,我看不到其他依赖项。
我在两者中都使用.Net4.5.2。
这是我的完整源代码 class
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace TradeAlgo
{
public class LZOCompressor
{
private static TraceSwitch _traceSwitch = new TraceSwitch("Simplicit.Net.Lzo", "Switch for tracing of the LZOCompressor-Class");
private const string LzoDll32Bit = @"lib32\lzo_32.dll";
#region Dll-Imports
[DllImport(LzoDll32Bit, EntryPoint = "lzo_version_string")]
private static extern IntPtr lzo_version_string32();
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_1_compress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_1_compress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_decompress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_decompress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "__lzo_init_v2", CallingConvention = CallingConvention.Cdecl)]
private static extern int __lzo_init_v2_32(uint v, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9);
#endregion
private byte[] _workMemory = new byte[16384L * 4];
public LZOCompressor()
{
int init = 0;
init = __lzo_init_v2_32(1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
if (init != 0)
{
throw new Exception("Initialization of LZO-Compressor failed !");
}
}
public byte[] Compress(byte[] src)
{
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: trying to compress {0}", src.Length));
}
byte[] dst = new byte[src.Length + src.Length / 64 + 16 + 3 + 4];
int outlen = 0;
lzo1x_1_compress32(src, src.Length, dst, ref outlen, _workMemory);
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: compressed {0} to {1} bytes", src.Length, outlen));
}
byte[] ret = new byte[outlen + 4];
Array.Copy(dst, 0, ret, 0, outlen);
byte[] outlenarr = BitConverter.GetBytes(src.Length);
Array.Copy(outlenarr, 0, ret, outlen, 4);
return ret;
}
public byte[] Decompress(byte[] src)
{
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: trying to decompress {0}", src.Length));
}
int origlen = BitConverter.ToInt32(src, src.Length - 4);
byte[] dst = new byte[origlen];
int outlen = origlen;
lzo1x_decompress32(src, src.Length - 4, dst, ref outlen, _workMemory);
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: decompressed {0} to {1} bytes", src.Length, origlen));
}
return dst;
}
}
}
如果我遗漏了任何细节,请告诉我,我们很乐意提供任何需要的信息。谢谢。
我看到 dll 包含在项目中,确保将 'Copy To Output Directory' 的 dll 属性设置为 'Copy if newer'。可能他们没有在您的 'Release' 文件夹中创建包含 dll 的文件夹。
我正在尝试使用相对路径导入 dll
private const string LzoDll32Bit = @"lib32\lzo_32.dll";
#region Dll-Imports
[DllImport(LzoDll32Bit, EntryPoint = "lzo_version_string")]
private static extern IntPtr lzo_version_string32();
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_1_compress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_1_compress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_decompress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_decompress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "__lzo_init_v2", CallingConvention = CallingConvention.Cdecl)]
private static extern int __lzo_init_v2_32(uint v, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9);
#endregion
{"Unable to load DLL 'lib32\lzo_32.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)"}
奇怪的是, http://wallaceturner.com/lzo-for-c,link 用于我下载示例项目以查看如何在 c#.net 中使用 lzo 压缩器的站点。 当我 运行 该项目成功运行时。除了我的项目中的依赖项之外,我看不到其他依赖项。 我在两者中都使用.Net4.5.2。
这是我的完整源代码 class
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace TradeAlgo
{
public class LZOCompressor
{
private static TraceSwitch _traceSwitch = new TraceSwitch("Simplicit.Net.Lzo", "Switch for tracing of the LZOCompressor-Class");
private const string LzoDll32Bit = @"lib32\lzo_32.dll";
#region Dll-Imports
[DllImport(LzoDll32Bit, EntryPoint = "lzo_version_string")]
private static extern IntPtr lzo_version_string32();
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_1_compress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_1_compress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "lzo1x_decompress", CallingConvention = CallingConvention.Cdecl)]
private static extern int lzo1x_decompress32(byte[] src, int src_len, byte[] dst, ref int dst_len, byte[] wrkmem);
[DllImport(LzoDll32Bit, EntryPoint = "__lzo_init_v2", CallingConvention = CallingConvention.Cdecl)]
private static extern int __lzo_init_v2_32(uint v, int s1, int s2, int s3, int s4, int s5, int s6, int s7, int s8, int s9);
#endregion
private byte[] _workMemory = new byte[16384L * 4];
public LZOCompressor()
{
int init = 0;
init = __lzo_init_v2_32(1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
if (init != 0)
{
throw new Exception("Initialization of LZO-Compressor failed !");
}
}
public byte[] Compress(byte[] src)
{
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: trying to compress {0}", src.Length));
}
byte[] dst = new byte[src.Length + src.Length / 64 + 16 + 3 + 4];
int outlen = 0;
lzo1x_1_compress32(src, src.Length, dst, ref outlen, _workMemory);
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: compressed {0} to {1} bytes", src.Length, outlen));
}
byte[] ret = new byte[outlen + 4];
Array.Copy(dst, 0, ret, 0, outlen);
byte[] outlenarr = BitConverter.GetBytes(src.Length);
Array.Copy(outlenarr, 0, ret, outlen, 4);
return ret;
}
public byte[] Decompress(byte[] src)
{
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: trying to decompress {0}", src.Length));
}
int origlen = BitConverter.ToInt32(src, src.Length - 4);
byte[] dst = new byte[origlen];
int outlen = origlen;
lzo1x_decompress32(src, src.Length - 4, dst, ref outlen, _workMemory);
if (_traceSwitch.TraceVerbose)
{
Trace.WriteLine(String.Format("LZOCompressor: decompressed {0} to {1} bytes", src.Length, origlen));
}
return dst;
}
}
}
如果我遗漏了任何细节,请告诉我,我们很乐意提供任何需要的信息。谢谢。
我看到 dll 包含在项目中,确保将 'Copy To Output Directory' 的 dll 属性设置为 'Copy if newer'。可能他们没有在您的 'Release' 文件夹中创建包含 dll 的文件夹。