ソリューションを作成しました。
SQL Server Compact Editionは、次の7つのdllで構成されています。
sqlceme40.dll
文書化されていないネイティブのフラットなAPIライブラリ(.netSystem.Data.SqlServerCe.dll
アセンブリはこのdllのラッパーです)
sqlceca40.dll
Engine
、、およびその他のいくつかのCOMオブジェクトReplication
を実装するCOM dllError
sqlceoledb40.dll
SSCE用のOLEdbプロバイダーを実装するCOMdll(ADOの使用を許可)
sqlcese40.dll
わからない
sqlceqp40.dll
わからない
sqlcecompact40.dll
わからない
sqlceer40en.dll
わからない
これらのdllを単純に出荷しようとする場合の問題は、そのうちの2つがCOMオブジェクトであるということです。COMオブジェクトdllを登録する必要があります。例:
>regsvr32 sqlceca40.dll
>regsvr32 sqlceoledb40.dll
問題は、COMオブジェクトの登録には管理者権限が必要なことです(グローバルソリューションを使用してローカルの問題を解決します)。これは、ユーザーが
- アプリケーションをインストールする必要があります(これは実行したくない)
- ユーザーに管理者権限が必要です(これは行いたくない)
幸いなことに、2001年にWindows XPを使用して、MicrosoftはこのCOMmonの問題を解決しました:登録なしのCOM。
まず、アプリケーションがSQL Server CompactEdition4.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>
このファイルを実行可能ファイルの横に(として)配置することも、リソースHyperion.exe.manifest
としてアプリケーションに組み込むこともできます。RT_MANIFEST
と呼ばれるアセンブリに対して依存関係があることに注意してくださいMicrosoft.SQLSERVER.CE.4.0
。最初に、次のディレクトリを作成してこのアセンブリを作成します。
Microsoft.SQLSERVER.CE.4.0
アプリケーションをデプロイするときは、この「アセンブリ」を構成する7つのdllすべてを、特別なファイルMicrosoft.SQLSERVER.CE.4.0
とともにこのサブフォルダーに配置します。.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 CompactEdition4.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 CompactEdition4.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