可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I developed a Windows service using C#.NET to generate PDF report. To generate PDF file I am using a third party dll. The application is running in my Windows XP platform. When I deployed the service in Windows Server 2008 64 bit version, I got this error:
Retrieving the COM class factory for
component with CLSID
{46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}
failed due to the following error:
80040154.
I registered the DLL using the regsvr32 command. I able to see this CLSID in the registry. But the problem persists.
What could be the problem?
回答1:
In VS - project properties - in the Build tab - platform target =X86
回答2:
It sounds like your service was built against \'Any CPU\', causing you errors on 64-bit where you are using COM components. You need to build it for x86
.
The website is probably running as a 32-bit process which is why it can use the component. Building your solution against x86
will force your service to run as 32-bit.
回答3:
I ran into a very similar issue.
I needed to use an old 32-bit DLL within a Web Application that was being developed on a 64-bit machine. I registered the 32-bit DLL into the windows\\sysWOW64 folder using the version of regsrv32 in that folder.
Calls to the third party DLL worked from unit tests in Visual Studio but failed from the Web Application hosted in IIS on the same machine with the 80040154 error.
Changing the application pool to \"Enable 32-Bit Applications\" resolved the issue.
回答4:
The problem is that the server process is 64 bit and the library is 32-bit and it tries to create the COM component in the same process (in-proc server). Either you recompile the server and make it 32-bit or you leave the server unchanged and make the COM component out-of-process. The easiest way to make a COM server out-of-process is to create a COM+ application - Control Panel -> Administrative Tools -> ComponentServices.
回答5:
You dont have to configure your project properties platform target X86.
You can also configure the iis options to work with x86 like that
- Select Application pool
- Select the pool which your app uses
- Advanced settings
- Enable 32 bit applications true
回答6:
If you are looking for a way to make this work without recompiling your Any CPU application, here is another potential workaround:
- Locate your COM object GUID under the HKey_Classes_Root\\Wow6432Node\\CLSID\\{GUID}
- Once located add a new REG_SZ (string) Value. Name should be AppID and data should be the same COM object GUID you have just searched for
- Add a new key under HKey_Classes_Root\\Wow6432Node\\AppID. The new key should be called the same as the COM object GUID.
- Under the new key you just added, add a new String Value, and call it DllSurrogate. Leave the value empty.
- Create a new Key under HKey_Local_Machine\\Software\\Classes\\AppID\\
Again the new key should be called the same as the COM object’s GUID. No values are necessary to be added under this key.
I take no credit for the solution, but it worked for us. Check the source link for more information and other comments.
Source: https://techtalk.gfi.com/32bit-object-64bit-environment/
回答7:
I didn\'t change any compile settings.
Just set \"Enable 32-bit Application = True\" in AppPool Advanced Settings.
It worked for me
回答8:
The solution for windows 2008 server x64 is:
- open cmd.exe with Administrator permission.
- Copy the dll to the folder C:\\Windows\\SysWOW64
- run regsvr32 from C:\\Windows\\SysWOW64
- Verify that dll is in registry of Windows.
- If you has a .exe x86 that use the dll, the exe must be compiled in x86 mode.
- The exe must be installed in folder C:\\Program Files (x86)
This procedure is valid, it is ok.
回答9:
Had a related issue with a different, but similar fix:
I had a Windows service project set to \"Any-CPU\" using a 64-bit DLL. Same error message. Tried a whole bunch of things, but nothing worked. Finally, I went into project Properties -> Build and noticed that project had \"Prefer 32-bit\" checked. Unchecked this and no more error.
My guess is that the windows service was expecting a 32-bit DLL, and couldn\'t find it.
回答10:
I had the same issue, but the other answers only supplied one part of the solution.
The solution is two fold:
Remove the 64bit from the Registery.
- c:\\windows\\system32\\regsvr32.exe /U
- This will not remove references to other copied of the dll in other folders.
or
- Find the key called HKEY_CLASSES_ROOT\\CLSID{......}\\InprocServer32. This key will have the filename of the DLL as its default value.
- I removed the HKEY_CLASSES_ROOT\\CLSID{......} folder.
Register it as 32bit:
C:\\Windows\\SysWOW64\\regsvr32 <file.dll>
Registering it as 32bit without removing the 64bit registration does not resolve my issue.
回答11:
To change to x86:
- Create a setup project for your solution.
- After you create it, Go to Solution Explorer, right click the setup project.
- Press Configuration Manager.
- Click on: \"Active Solution Platform\" combobox and select New (If there is no x86 displayed)
- Select from first combo x86 then press OK.
- rebuild Setup project, then rebuild All the project.
回答12:
If you are running a website, you could also try to set your application pool to disable 32-bit Applications (under advanced settings of a pool).
回答13:
For anyone using VSTO, the problem for me was a missing reference to the office
assembly. It would also appear if you were trying to instantiate certain VSTO objects manually.
回答14:
In my personal case the issue was fixed searching for the class id in the Windows\'s Registry on developer machine (because the issue was thrown in a client PC). This action will be placed into the COM component that causes the issue: an x86 library referenced in my .NET project that was not being registered as OCX/COM for the installer or updater application.
Regards
回答15:
My problem was that I had the wrong MS Sync FrameWork version (1.0) in my project References. After update to the version 2.1, the error was gone and life is good again.
回答16:
I found that my problem related to the actual registration of the DLL.
First run \"Regedit.exe\" from a CMD prompt (I raised it\'s security level to Administrator, \"just in case\") then search the Registry (by clicking on \"Edit/Find\" in the RegEdit menu or by pressing Ctrl+F)
for the CLSID showing in the error message which you received regarding the COM class factory. My CLSID was 29AB7A12-B531-450E-8F7A-EA94C2F3C05F. When this key is found,
select the sub-key \"InProcServer2\" under that Hive node and ascertain the filename of the problem DLL in the right hand Regedit frame. showing under \"Default\" .
If that file resides in \"C:\\Windows\\SysWow64\"(such as C:\\Windows\\SysWow64\\Redemption.dll\")
then it is important that you use the \"C:\\Windows\\SysWow64\\RegSvr32.exe\" file to register that DLL from the command line and NOT the default \"C:\\Windows\\System32\\RegSvr32.exe\" file.
So I ran a CMD prompt (under Administrative level control (just in case this level is need required) and type on the command line (in the case of my DLL):
C:\\Windows\\SysWow64\\RegSvr32.exe c:\\Windows\\SysWow64\\Redemption.dll the press enter.
Close the command window (via \"Exit\" then Restart your computer (always use restart instead of Close Down then start up, since (strangely) Restart perform a thorough shut down and reload of everything whereas \"Shut Down\" and Power-Up reloads a stored cache of drivers and other values (which may be faulty).
Whenever you register a DLL in the future, remember to use the SysWow64 \"RegSvr32.exe\" for any DLL stored in the C:\\Windows\\SysWow64 folder and this problem c(if it is caused by incorrect registration) should not happen again.