C#加载库错误\u无\u标记

C#加载库错误\u无\u标记,c#,loadlibrary,kernel32,C#,Loadlibrary,Kernel32,我正在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

我正在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." );
}
}

Nulter为1008=0x3F0,这应该是错误\u无\u标记。 这在C#中到底是什么意思?
DLL的路径正确。

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

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

将LoadLibrary更改为:

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

代码
ERROR\u NO\u TOKEN
通常表示有人试图在未模拟的线程上调用
OpenThreadToken
。这可能是个问题,也可能不是问题-这只是
SetlastError
记录的最后一个错误代码

此调用可以在
interfacecia_C_2005.dll的
DllMain
中,也可以在任何依次引用的库的
DllMain
中进行。他们为什么需要这样做还不完全清楚,但这是可能的

此外,这可能不是导致故障的实际错误。除其他原因外,如果
interfacecia_C_2005.dll
DllMain
或任何依次引用的库的
DllMain
返回false,则
LoadLibrary
将失败。如果DllMain返回false,而不调用
SetLastError
,则GetLastError将显示先前的错误,不管它是什么。例如,
OpenThreadToken
失败后,系统可能会非常高兴,但出现了其他问题,没有调用
SetLastError


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

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