![](/img/trans.png)
[英]Is dllexport needed in the source C dll to be able to be used in c# with [DllImport]?
[英]c#: how to know the full path of dll used in DllImport?
我在我的代码中导入dll是这样的:
[DllImport("dll.dll", CharSet = CharSet.Ansi)]
private static extern int function(String pars, StringBuilder err);
我想知道该函数是否有效,但它不在项目内部,也不在Debug或Release文件夹中。 即“dll.dll”不应该可用,因为它不在当前项目文件夹中,但是它可用。 现在我想知道运行时使用的dll的确切完整路径,但不知道如何获取它。
您将不得不使用win32 API。
首先使用GetModuleHandle传递“dll.dll”。 然后将该句柄传递给GetModuleFileName 。
string GetDllPath()
{
const int MAX_PATH = 260;
StringBuilder builder = new StringBuilder(MAX_PATH);
IntPtr hModule = GetModuleHandle("dll.dll"); // might return IntPtr.Zero until
// you call a method in
// dll.dll causing it to be
// loaded by LoadLibrary
Debug.Assert(hModule != IntPtr.Zero);
uint size = GetModuleFileName(hModule, builder, builder.Capacity);
Debug.Assert(size > 0);
return builder.ToString(); // might need to truncate nulls
}
[DllImport("kernel32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr GetModuleHandle(string lpModuleName);
[DllImport("kernel32.dll", SetLastError=true)]
[PreserveSig]
public static extern uint GetModuleFileName
(
[In] IntPtr hModule,
[Out] StringBuilder lpFilename,
[In][MarshalAs(UnmanagedType.U4)] int nSize
);
请参阅动态链接库搜索顺序 - 这应该适用于P / Invoke,但行为稍有可变,具体取决于加载方法。 但是它没有说明如何确定加载的DLL的文件名;-)
在运行时找到DLL路径的完全未经测试且可能是不明智的解决方案。 这假设P / Invoke和LoadLibrary使用相同的分辨率(例如,P / Invoke不使用LoadLibraryEx和LOAD_WITH_ALTERED_SEARCH_PATH)并且与此方法没有可怕的冲突。
使用LoadLibrary或LoadLibaryEx加载DLL。
使用GetModuleFileName和步骤#1中获得的句柄查找模块的文件名。
使用FreeLibrary卸载模块。 P / Invoke应该保持模块reference-count> 0,但是再次,这是未经测试的;-)
(不保证上述解决方案的正确性或有效性。欢迎提出建议,警告和/或更正.YMMV。)
快乐的编码。
如果你真的想知道 ,请使用dependency-walker
它甚至可以在运行时“监控”您的应用程序并检测动态负载,因此不会隐藏任何内容
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.