0

I am trying to run OpenALPR inside my WCF application, and far I am not able to run it. I keep getting

"Could not load file or assembly 'openalpr-net.DLL' or one of its dependencies. The specified module could not be found."

error on both IIS as well as in VS2015-Community edition.

I have followed the following thread, but was not able to resolve my issue.

https://groups.google.com/forum/#!topic/openalpr/7ADDNSkhoLE
https://groups.google.com/forum/#!topic/openalpr/Nu26YmbOSng

All over the internet it says it is platform issue, this is what I have as of now.

Visual Studio 2015 WCF Application
Reference to openalpr-net.dll (64bit) in my project
Copied opencv_world300.dll, opencv_ffmpeg300_64.dll, liblept170.dll into bin folder manually
Included openalpr.conf in the root folder of WCF application
Included runtime_data folder in the root folder of WCF application
Set 'unblock' for all the dll's, and files under runtime_data folder
Project > Properties > Build > General > Platform target > x64
Project > Properties > Build > Configuration > Active(Debug)
Project > Properties > Build > Platform > Active (x64)

I also published the app to local iis server, I set the application pool to integrated mode with .net 4.0, I tried to enable and disable 'Enable 32-bit application', but both of these didn't work for me.

When I select Service.svc in the solution explorer, and debug the app, I get below error in the WCF Test Client

Error: Cannot obtain Metadata from http://localhost:55460/AlprService.svc If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address. For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error URI: http://localhost:55460/AlprService.svc Metadata contains a reference that cannot be resolved: 'http://localhost:55460/AlprService.svc'. The content type text/html; charset=utf-8 of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were: '
Server Error in '/' Application.
Could not load file or assembly 'openalpr-net.DLL' or one of its dependencies. The specified module could not be found.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.IO.FileNotFoundException: Could not load file or assembly 'openalpr-net.DLL' or one of its dependencies. The specified module could not be found.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace:

[FileNotFoundException: Could not load file or assembly 'openalpr-net.DLL' or one of its dependencies. The specified module could not be found.]   System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +0   System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) +234   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean forIntrospection) +108   System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) +25   System.Reflection.Assembly.Load(String assemblyString) +34   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +49[ConfigurationErrorsException: Could not load file or assembly 'openalpr-net.DLL' or one of its dependencies. The specified module could not be found.]   System.Web.Configuration.CompilationSection.LoadAssemblyHelper(String assemblyName, Boolean starDirective) +772   System.Web.Configuration.CompilationSection.LoadAllAssembliesFromAppDomainBinDirectory() +259   System.Web.Configuration.CompilationSection.LoadAssembly(AssemblyInfo ai) +163   System.Web.Compilation.BuildManager.GetReferencedAssemblies(CompilationSection compConfig) +230   System.Web.Compilation.BuildManager.GetPreStartInitMethodsFromReferencedAssemblies() +76   System.Web.Compilation.BuildManager.CallPreStartInitMethods(String preStartInitListPath, Boolean& isRefAssemblyLoaded) +139   System.Web.Compilation.BuildManager.ExecutePreAppStart() +176   System.Web.Hosting.HostingEnvironment.Initialize(ApplicationManager appManager, IApplicationHost appHost, IConfigMapPathFactory configMapPathFactory, HostingEnvironmentParameters hostingParameters, PolicyLevel policyLevel, Exception appDomainCreationException) +882[HttpException (0x80004005): Could not load file or assembly 'openalpr-net.DLL' or one of its dependencies. The specified module could not be found.]   System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +579   System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +112   System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +716

I can run the following command from readme.txt file in the download folder without any issue, and can see the result 'alpr -p tx -n 30 samples/us-4.jpg'

Also, when I switch on Enable 32-bit application on IIS, I get error saying projectname.dll was not loaded, other it would be 'openalpr-net.DLL' not missing. I am publishing Release - x64 to IIS.

Can anyone suggest or point me in the right direction? What am I doing wrong here?

Auguste
  • 2,007
  • 2
  • 17
  • 25
Hitin
  • 442
  • 7
  • 21

1 Answers1

0

I was scratching my head over this very same question but finally got it working;

Make sure you add a reference to the 64-bit openalpr-net.dll.

In your WCF code make sure you are loading the conf file and runtime_data folder from the same folder where the assembly is by using this code

 public string AssemblyDirectory
    {
        get
        {
            var codeBase = Assembly.GetExecutingAssembly().CodeBase;
            var uri = new UriBuilder(codeBase);
            var path = Uri.UnescapeDataString(uri.Path);
            return Path.GetDirectoryName(path);
        }
   }
        String config_file = Path.Combine(AssemblyDirectory, "openalpr.conf");
        String runtime_data_dir = Path.Combine(AssemblyDirectory, "runtime_data");

        using (var alpr = new AlprNet("us", config_file, runtime_data_dir))

Publish your wcf to local or remote IIS. Say you publish it to c:\inetpub\wwwroot\alprService. Copy the openalpr.conf file and the runtime_data folder to the c:\inetpub\wwwroot\alprService\bin\ folder. Copy the 3 dlls, liblept170.dll, opencv_ffmpeg300_64.dll and opencv_world300.dll to the system32 folder on the hosting server. You will find these dlls in the same folder as your openalpr-net.dll from the github.

Let me know if this worked for you. I am able to send an image and get a list of matches back.

Now you should be able to load the wcf service without the error.

A. Nayar
  • 1
  • 1