【问题标题】:C# LoadLibrary ERROR_NO_TOKENC# 加载库 ERROR_NO_TOKEN
【发布时间】:2013-05-10 01:08:16
【问题描述】:

我在 C# 中加载了一个具有依赖关系的 MFC dll(假设我正在加载依赖于 C.dll、B.dll 和 A.dll 的 D.dll)。 这是我的代码:

[DllImport( "kernel32.dll", CharSet = CharSet.Auto, SetLastError = true )]
static extern IntPtr LoadLibrary( string lpFileName );

private void btn_Click( object sender, EventArgs e )
{
int             nUltErr;
string          strDLL;
StringBuilder   strPDF;
StringBuilder   strXML;

strDLL = "C:\\DEVELOP\\Libs\\Interfaccia\\Interfaccia_C_2005\\DLL\\Interfaccia_C_2005.dll";
strFile1 = new StringBuilder( @"C:\DEVELOP\Libs\Interfaccia\TestCase\PROGRAM\tiger.pdf" );
strFile2 = new StringBuilder( @"C:\DEVELOP\Libs\Interfaccia\TestCase\PROGRAM\tiger.XML" );
if( LoadLibrary( strDLL ) != IntPtr.Zero )
{
    LoadPDF( strPDF );
    SaveXML( strXML );
    ClosePDF();
    FreeMemory();
}
else
{
    nUltErr = Marshal.GetLastWin32Error();
    MessageBox.Show( "Errore nel caricamento della dll." );
}

}

nUltErr 是 1008 = 0x3F0,应该是 ERROR_NO_TOKEN。 这在 C# 中到底是什么意思? DLL 的路径是正确的。

【问题讨论】:

  • DllImportAttribute.SetLastError 默认为false。您的导入定义不会更改默认行为。显式设置SetLastError = true 以获取由LoadLibrary 引起的错误代码。

标签: c# loadlibrary kernel32


【解决方案1】:

您尚未在DllImport 属性上设置SetLastError 字段。

这意味着您没有从 Marshal.GetLastWin32Error() 获得正确的值。

将 LoadLibrary 更改为:

[DllImport( "kernel32.dll", CharSet = CharSet.Auto, SetLastError = true )]
static extern IntPtr LoadLibrary( string lpFileName );

【讨论】:

    【解决方案2】:

    代码ERROR_NO_TOKEN 通常意味着有人试图在非模拟线程上调用OpenThreadToken。这可能是问题,也可能不是问题 - 这只是 SetlastError 记录的最后一个错误代码。

    此调用可能在Interfaccia_C_2005.dllDllMain 中,或者在依次引用的任何库的DllMain 中。他们为什么需要这样做并不完全清楚,但这是可能的。

    另外,这可能不是导致失败的实际错误。除其他原因外,如果Interfaccia_C_2005.dllDllMain 或依次引用的任何库的DllMain 中的LoadLibrary 返回false,则LoadLibrary 将失败。如果 DllMain 返回 false,而不调用 SetLastError,GetLastError 将显示 previous 错误,无论它是什么。例如,系统可能很高兴OpenThreadToken 失败,但出现了其他问题,没有调用SetLastError

    基本上,您需要启动本机代码调试器,看看它会告诉您什么。

    【讨论】:

      猜你喜欢
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多