
另外,你既然能够在你的应用中使用Assembly.LoadFrom这样的方法,那test1.dll他们的路径就是已知的了,何必还要通过反射程序集内部方法来获取它的Location呢?
如果你是将test1.dll注册到了全局环境中,那么我郑裤建议你不要使用LoadFrom和LoadFile,改用Load方法:将test1和test2通过版本号或者公钥(PublicKey)加以区别,然后用Load方肆备法调用。调用参数类似于:“程序集名,Version=版本1,culture=区域信息1,PublicKeyToken=公钥1”,这是微软标准的做法。
今天我也遇见纳毕早这个问题,最终的解决方法如下:找到VS的缓存保存文件数中夹,将文件夹下面的东西全洞雀部删除掉,然后就不会出错了。C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\root\89ae99e4\e0eff96a\assembly\dl3那个应该是给饥尘你调用.net程序集DLL用的不是给你调用这种非托管DLL用的吧?
如果不确定非托管DLL是否可以用这种方式加载烂蚂禅,
那么用DllImport从kernel32.dll引入LoadLibraryW和GetProcAddress
用这两个API去获取函数指针
举个例子
using Systemusing System.Text
using System.Runtime.InteropServices
class Program
{
[DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "LoadLibraryW", CharSet=CharSet.Unicode)]
extern static IntPtr LoadLibrary(string file)
[DllImport("kernel32.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "GetProcAddress")]
extern static IntPtr GetProcAddress(IntPtr hMod, byte[] pName)
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
物歼 delegate void DeleSleep(UInt32 time)
static void Main(string[] args)
{
DeleSleep sleep
IntPtr hk32 = LoadLibrary("kernel32.dll")
IntPtr pSleep = GetProcAddress(hk32, Encoding.UTF8.GetBytes("Sleep"))
sleep = (DeleSleep) Marshal.GetDelegateForFunctionPointer(pSleep, typeof(DeleSleep))
sleep(3000)
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)