Native Assembly Binding fails for ASP.NET solution

roflol

New Member
NOTE: This main purpose of the question to UNDERSTAND/EXPLAIN the assembly binding behavior of the CLR. The solution should be evident once the reason is pinned down. Please, know that I understand my setup is not optimal (nativedll not signed and versioned etc) but again I just want to investigate the binding behavior of the CLR. I am attempting to use a native (non-COM, C++) dll into my asp.net solution. I am going to refrain from naming the dll because I think it diverts the topic in the wrong direction. The native dll is from a blog site and does not have much information with it. I do not have any information about the native dll like architecture it was compiled on, what culture and version it is etc. Using the provided wrapper, I can use the dll in a console application properly. It works, even though we have to use partial assembly name for binding. The wrapper for the native assembly has DLL imports like [DllImport("nativedll.dll")] public static extern void someMethod([Out] BE_VERSION pbeVersion); I have read through loads and loads of information about CLR assembly binding including:
How the Runtime Locates Assemblies
Best Practices for Assembly Loading Per my understanding, we should be able to get the assembly loaded, but no. I get assembly binding errors.

SETUP

My helper library (compiled as MSIL (Any CPU)) that call the native dll is strong named and is in the GAC.. I am running my asp.net app on a Win 7, x64 bit machine on IIS, not the visual studio development server. The nativedll is NOT signed and NOT GACed.THE ISSUE The summary is, when I place the native dll in the windows directory, (c:\Windows) the solution works fine. In any other case, I get assembly binding errors.

QUESTIONS
1. I would like to know what why is the assembly getting bound when dropped in the windows directory?2. What does it mean by error: ERR: Error extracting manifest import from file (hr = 0x80131018)? (Look at Scenario 1, Scenario 6)
3. Why does the call to Assembly.Load*() methods fail? (Scenario 3, 4, 5)RESULTS OF MY TESTING

Scenario 1:
**Setup**Calling Assembly: GACed.Native Assembly: Included in project; Build Action: None; Copy To Output Directory: Copy Always.**Description:** Logged into the site, home page open. Did not navigate to the page with native call.**Result:** Binding Error *** Assembly Binder Log Entry (12/13/2012 @ 11:28:23 AM) *** The operation failed. Bind result: hr = 0x80131018. No description available. Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll Running under executable C:\Windows\SysWOW64\inetsrv\w3wp.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = NT AUTHORITY\SYSTEM LOG: DisplayName = nativedll (Partial) WRN: Partial binding information was supplied for an assembly: WRN: Assembly Name: nativedll | Domain ID: 2 WRN: A partial bind occurs when only part of the assembly display name is provided. WRN: This might result in the binder loading an incorrect assembly. WRN: It is recommended to provide a fully specified textual identity for the assembly, WRN: that consists of the simple name, version, culture, and public key token. WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue. LOG: Appbase = file:///C:/WebUI/ LOG: Initial PrivatePath = C:\WebUI\bin LOG: Dynamic Base = C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\webui\69d9ded4 LOG: Cache Base = C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\webui\69d9ded4 LOG: AppName = ca4be085 Calling assembly : (Unknown). === LOG: This bind starts in default load context. LOG: Using application configuration file: C:\WebUI\web.config LOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/webui/69d9ded4/ca4be085/nativedll.DLL. LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/webui/69d9ded4/ca4be085/nativedll/nativedll.DLL. LOG: Attempting download of new URL file:///C:/WebUI/bin/nativedll.DLL. LOG: Assembly download was successful. Attempting setup of file: C:\WebUI\bin\nativedll.dll LOG: Entering download cache setup phase. ERR: Error extracting manifest import from file (hr = 0x80131018). ERR: Setup failed with hr = 0x80131018. ERR: Failed to complete setup of assembly (hr = 0x80131018). Probing terminated. Scenario 2:
**Setup**Scenario 1 + Just copy the nativedll to C:\Windows folder. No reset of anytype. **Description**Navigate to the page calling native.Result: Success. Native Functionality is invoked. No binding failure.Scenario 3:
**Setup**Calling Assembly: GACed.Native Assembly: Build Action: None; Copy To Output Directory: Copy Always.Description: Breakpoint at the point of native function call, use immediate window to execute the following code: var pat = pat = Path.Combine(AppDomain.CurrentDomain.RelativeSearchPath, "nativedll.dll"); var a = Assembly.LoadFrom(pat); **Result** Exception raised: System.BadImageFormatException was unhandled HResult=-2146234344 Message=Could not load file or assembly 'file:///C:\WebUI\bin\nativedll.dll' or one of its dependencies. The module was expected to contain an assembly manifest. Source=mscorlib FileName=file:///C:\WebUI\bin\nativedll.dll FusionLog=Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll Running under executable C:\Windows\SysWOW64\inetsrv\w3wp.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = NT AUTHORITY\SYSTEM LOG: Where-ref bind. Location = C:\WebUI\bin\nativedll.dll LOG: Appbase = file:///C:/WebUI/ LOG: Initial PrivatePath = C:\WebUI\bin Calling assembly : (Unknown). === LOG: This bind starts in LoadFrom load context. WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load(). LOG: Using application configuration file: C:\WebUI\web.config LOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Attempting download of new URL file:///C:/WebUI/bin/nativedll.dll. ERR: Failed to complete setup of assembly (hr = 0x80131018). Probing terminated. StackTrace: at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) at System.Reflection.RuntimeAssembly.InternalLoadFrom(String assemblyFile, Evidence securityEvidence, Byte[] hashValue, AssemblyHashAlgorithm hashAlgorithm, Boolean forIntrospection, Boolean suppressSecurityChecks, StackCrawlMark& stackMark) at System.Reflection.Assembly.LoadFrom(String assemblyFile) InnerException: Scenario 4:
**Setup** Calling Assembly: GACed. Native Assembly: Build Action: None; Copy To Output Directory: Copy Always.**Description** Breakpoint at the point of native function call, use immediate window to execute the following code: var pat = pat = Path.Combine(AppDomain.CurrentDomain.RelativeSearchPath, "nativedll.dll"); var a = Assembly.Load(pat);**Result** Exception raised: System.IO.FileLoadException was unhandled HResult=-2146234297 Message=Could not load file or assembly 'C:\\WebUI\\bin\\nativedll.dll' or one of its dependencies. The given assembly name or codebase was invalid. (Exception from HRESULT: 0x80131047) Source=mscorlib FileName=C:\\WebUI\\bin\\nativedll.dll FusionLog="" StackTrace: at System.Reflection.AssemblyName.nInit(RuntimeAssembly& assembly, Boolean forIntrospection, Boolean raiseResolveEvent) at System.Reflection.RuntimeAssembly.CreateAssemblyName(String assemblyString, Boolean forIntrospection, RuntimeAssembly& assemblyFromResolveEvent) at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) at System.Reflection.Assembly.Load(String assemblyString) InnerException: Scenario 5:
**Setup**Calling Assembly: GACed.Native Assembly: Build Action: None; Copy To Output Directory: Copy Always.**Description: ** Breakpoint at the point of native function call, use immediate window to execute the following code: var pat = pat = Path.Combine(AppDomain.CurrentDomain.RelativeSearchPath, "nativedll.dll"); var a = Assembly.LoadFile(pat); **Result** Exception raised: System.BadImageFormatException was unhandled HResult=-2146234344 Message=The module was expected to contain an assembly manifest. (Exception from HRESULT: 0x80131018) Source=mscorlib StackTrace: at System.Reflection.RuntimeAssembly.nLoadFile(String path, Evidence evidence) at System.Reflection.Assembly.LoadFile(String path) InnerException: Scenario 6:
**Setup**Calling Assembly: GACed.Native Assembly: Excluded from project. Manually copied into the bin folder prior to execution.**Description: ** Logged into the site, home page open. Did not navigate to the page with native call. **Result** Binding Error: (Output: Assembly Binding Log Viewer) Assembly Binder Log Entry (12/13/2012 @ 2:19:13 PM) The operation failed. Bind result: hr = 0x80131018. No description available. Assembly manager loaded from: C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll Running under executable C:\Windows\SysWOW64\inetsrv\w3wp.exe --- A detailed error log follows. === Pre-bind state information === LOG: User = NT AUTHORITY\SYSTEM LOG: DisplayName = nativedll (Partial) WRN: Partial binding information was supplied for an assembly: WRN: Assembly Name: nativedll | Domain ID: 2 WRN: A partial bind occurs when only part of the assembly display name is provided. WRN: This might result in the binder loading an incorrect assembly. WRN: It is recommended to provide a fully specified textual identity for the assembly, WRN: that consists of the simple name, version, culture, and public key token. WRN: See whitepaper http://go.microsoft.com/fwlink/?LinkId=109270 for more information and common solutions to this issue. LOG: Appbase = file:///C:/Web/WebUI/ LOG: Initial PrivatePath = C:\WebUI\bin LOG: Dynamic Base = C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\webui\69d9ded4 LOG: Cache Base = C:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\webui\69d9ded4 LOG: AppName = ca4be085 Calling assembly : (Unknown). === LOG: This bind starts in default load context. LOG: Using application configuration file: C:\WebUI\web.config LOG: Using host configuration file: C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/webui/69d9ded4/ca4be085/nativedll.DLL. LOG: Attempting download of new URL file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/webui/69d9ded4/ca4be085/nativedll/nativedll.DLL. LOG: Attempting download of new URL file:///C:/WebUI/bin/nativedll.DLL. LOG: Assembly download was successful. Attempting setup of file: C:\\WebUI\bin\nativedll.dll LOG: Entering download cache setup phase. ERR: Error extracting manifest import from file (hr = 0x80131018). ERR: Setup failed with hr = 0x80131018. ERR: Failed to complete setup of assembly (hr = 0x80131018). Probing terminated.Scenario 7:
**Setup**Scenario 6 + Just copy the nativedll to C:\Windows folder. No reset of anytype. **Description**Navigate to the page calling native.Result: Success. Native Functionality is invoked. No binding failure.
 
Back
Top