我已经创建了解决方案。
SQL Server Compact Edition 由 7 个 dll 组成:
sqlceme40.dll未记录的本机平面 API 库(.netSystem.Data.SqlServerCe.dll程序集是此 dll 的包装器)
sqlceca40.dll一个实现Engine,Replication和Error一些其他 COM 对象的 COM dll
sqlceoledb40.dll为 SSCE 实现 OLEdb 提供程序的 COM dll(允许使用 ADO)
sqlcese40.dll 未知
sqlceqp40.dll 未知
sqlcecompact40.dll 未知
sqlceer40en.dll 未知
试图简单地发送这些 dll 的问题是其中两个是COM对象。COM 对象 dll 需要注册,例如:
>regsvr32 sqlceca40.dll
>regsvr32 sqlceoledb40.dll
问题是注册 COM 对象需要管理权限(使用全局解决方案来解决本地问题)。这意味着您的用户将
- 必须安装您的应用程序(您不想这样做)
- 要求您的用户具有管理权限(您不想这样做)
幸运的是,从 2001 年的 Windows XP 开始,微软解决了这个常见的问题:免注册 COM。
首先,您将声明您的应用程序对 SQL Server Compact Edition 4.0具有“依赖性” 。您可以通过编写程序集清单来做到这一点:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
version="1.0.0.0"
processorArchitecture="X86"
name="client"
type="win32"
/>
<description>Hyperion Pro</description>
<!-- We have a dependancy on SQL Server CE 4.0 -->
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="Microsoft.SQLSERVER.CE.4.0"
version="4.0.0.0" processorArchitecture="x86"
/>
</dependentAssembly>
</dependency>
<!-- We are high-dpi aware on Windows Vista -->
<asmv3:application xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<asmv3:windowsSettings
xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
<dpiAware>true</dpiAware>
</asmv3:windowsSettings>
</asmv3:application>
<!-- We were designed and tested on Windows 7 -->
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates application support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--The ID below indicates application support for Windows Vista -->
<!--supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/-->
</application>
</compatibility>
<!-- Disable file and registry virtualization -->
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
您可以将此文件放在您的可执行文件(as )旁边Hyperion.exe.manifest,或者您可以将它作为RT_MANIFEST资源构建到您的应用程序中。
请注意,我们依赖于名为 的程序集Microsoft.SQLSERVER.CE.4.0。我们首先通过创建一个名为的目录来创建此程序集:
Microsoft.SQLSERVER.CE.4.0
当您部署您的应用程序时,您会将构成此“程序集”Microsoft.SQLSERVER.CE.4.0的所有 7 个 dll连同一个特殊文件一起放入此子文件夹.manifest:
C:\
╰──Users
╰──Ian
╰──AppData
╰──Local
╰──Hyperion Pro
├──Hyperion.exe
├──Hyperion.exe.manifest
╰──Microsoft.SQLSERVER.CE.4.0
├──sqlceme40.dll
├──sqlceca40.dll
├──sqlceoledb40.dll
├──sqlcese40.dll
├──sqlceqp40.dll
├──sqlcecompact40.dll
├──sqlceer40en.dll
╰──Microsoft.SQLSERVER.CE.4.0.manifest
换句话说,应用程序文件夹包含您的应用程序和Microsoft.SQLSERVER.CE.4.0文件夹:
Directory of C:\Users\Ian\AppData\Local\Hyperion Pro
05/29/2012 09:23 AM 1,899,008 Hyperion.exe
05/28/2012 01:46 PM 1,587 Hyperion.exe.manifest
05/29/2012 09:27 AM <DIR> Microsoft.SQLSERVER.CE.4.0
2 File(s) 1,900,675 bytes
1 Dir(s) 20,851,503,104 bytes free
您任务的下一部分是定义Microsoft.SQLSERVER.CE.4.0.manifest文件。免注册 COM 允许清单文件声明所有 COM 对象及其 clsid。这需要大量的逆向工程。但是 SQL Server Compact Edition 4.0 的程序集清单是:
Microsoft.SQLSERVER.CE.4.0.manifest:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="Microsoft.SQLSERVER.CE.4.0"
processorArchitecture="x86"
version="4.0.0.0" />
<!-- OLEDB Provider -->
<file name = "sqlceoledb40.dll">
<comClass
description = "Microsoft SQL Server Compact OLE DB Provider for Windows"
clsid="{2006C53A-C915-41EA-BAA9-9EAB3A1FBF97}"
threadingModel = "Both"
progid = "Microsoft.SQLSERVER.CE.OLEDB.4.0" />
</file>
<!-- Native flat engine library -->
<file name="sqlceme40.dll" />
<!-- Engine and Replication COM object -->
<file name="sqlceca40.dll">
<comClass description="Active SSCE Engine Object"
clsid="{68D45319-3702-4837-9F8E-DA6845D82482}"
threadingModel="Both"
progid="SSCE.Engine.4.0" />
<comClass description="SSCE Error Object"
clsid="{36228F21-B5C7-4054-8DC2-47D3E236E8B5}"
threadingModel="Both"
progid="SSCE.Error.4.0" />
<comClass description="SSCE Param Object"
clsid="{0B3A7B75-A9B0-4580-9AA5-1A7DA47AD1CB}"
threadingModel="Both"
progid="SSCE.Param.4.0" />
<comClass description="Active SSCE Replication Object"
clsid="{11D5B2D4-26A4-44F5-A48B-0FAC3A919ED8}"
threadingModel="Both"
progid="SSCE.Replication.4.0" />
<comClass description="Active SSCE remote data access Object"
clsid="{58BC9AD6-BF11-40B3-9AB1-E3F2ED784C08}"
threadingModel="Both"
progid="SSCE.RemoteDataAccess.4.0" />
<typelib tlbid="{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}"
version="4.0"
helpdir=""/>
</file>
<comInterfaceExternalProxyStub
name="ISSCEEngine"
iid="{10EC3E45-0870-4D7B-9A2D-F4F81B6B7FA2}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />
<comInterfaceExternalProxyStub
name="ISSCEError"
iid="{31155A3B-871D-407F-9F73-DEBFAC7EFBE3}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />
<comInterfaceExternalProxyStub
name="ISSCERDA"
iid="{4F04F79D-1FF1-4DCD-802B-3D51B9356C14}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />
<comInterfaceExternalProxyStub
name="ISSCEParams"
iid="{A78AFF90-049C-41EC-B1D8-665968AAC4A6}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />
<comInterfaceExternalProxyStub
name="ISSCEParam"
iid="{A9876C60-2667-44E5-89DB-E9A46ED392C0}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />
<comInterfaceExternalProxyStub
name="ISSCEErrors"
iid="{C40143CA-E9F9-4FF4-B8B4-CC02C064FC1B}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />
<comInterfaceExternalProxyStub
name="ISSCEMerge"
iid="{C6EB397F-D585-428D-A4F4-454A1842CB47}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid = "{CE4AACFA-3CFD-4028-B2D9-F272314F07C8}" />
<file name="sqlceqp40.dll" />
<file name="sqlcese40.dll" />
<file name="sqlcecompact40.dll" />
<file name="sqlceer40EN.dll" />
</assembly>
最后一个问题是,就像我们依赖于名为 的程序集一样Microsoft.SQLSERVER.CE.4.0,SQL Server Compact Edition 4.0 反过来又依赖于名为 的程序集Microsoft.VC90.CRT。幸运的是,您安装的 SQLCE 附带了此程序集的副本:
Microsoft.VC90.CRT
├──Microsoft.VC90.CRT.manifest
╰──msvcr90.dll
这意味着最终的目录结构是:
C:\
╰──Users
╰──Ian
╰──AppData
╰──Local
╰──Hyperion Pro
├──Hyperion.exe
├──Hyperion.exe.manifest
╰──Microsoft.SQLSERVER.CE.4.0
├──Microsoft.SQLSERVER.CE.4.0.manifest
├──sqlceme40.dll
├──sqlceca40.dll
├──sqlceoledb40.dll
├──sqlcese40.dll
├──sqlceqp40.dll
├──sqlcecompact40.dll
├──sqlceer40en.dll
╰──Microsoft.VC90.CRT
├──Microsoft.VC90.CRT.manifest
╰──msvcr90.dll