2011-08-02 11 views
2

動的アセンブリロードでClickOnceを使用します。私は最近、ソリューション内の "モデル"プロジェクトにEF4モデルを追加しました。EF4がすべてのアセンブリを動的にロードするのを防ぐ方法

アプリケーションでは接続文字列にapp.configファイルを使用してはいけません。そのため、EntityConnectionを使用してObjectContextを作成します。

アプリケーションロジックは完全に機能しますが、ClickOnceを使用してアプリケーションをデプロイするときにObjectContextのインスタンスを作成すると、EF4はすべての関連するアセンブリを動的にロードしてメタデータを見つけようとします。

これはclickonceがclickonce dllマップのすべてのアセンブリをダウンロードするよう強制します! ObjectContextのctorのを呼び出すときにここで

は、スタックトレースです:

at System.AppDomain.OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName) 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.Assembly.Load(AssemblyName assemblyRef) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.SafeLoadReferencedAssembly(AssemblyName assemblyName) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.<GetNonSystemReferencedAssemblies>d__0.MoveNext() 
    at System.Data.Metadata.Edm.DefaultAssemblyResolver.GetAllDiscoverableAssemblies() 
    at System.Data.Metadata.Edm.DefaultAssemblyResolver.GetWildcardAssemblies() 
    at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.LoadResources(String assemblyName, String resourceName, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
    at System.Data.Metadata.Edm.MetadataArtifactLoaderCompositeResource.CreateResourceLoader(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
    at System.Data.Metadata.Edm.MetadataArtifactLoader.Create(String path, ExtensionCheck extensionCheck, String validExtension, ICollection`1 uriRegistry, MetadataArtifactAssemblyResolver resolver) 
    at System.Data.Metadata.Edm.MetadataCache.SplitPaths(String paths) 
    at System.Data.Common.Utils.Memoizer`2.<>c__DisplayClass2.<Evaluate>b__0() 
    at System.Data.Common.Utils.Memoizer`2.Result.GetValue() 
    at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg) 
    at System.Data.EntityClient.EntityConnection.GetMetadataWorkspace(Boolean initializeAllCollections) 
    at System.Data.Objects.ObjectContext.RetrieveMetadataWorkspaceFromConnection() 
    at System.Data.Objects.ObjectContext..ctor(EntityConnection connection, Boolean isConnectionConstructor) 

私はこれをやってから、EF4を防ぐことができますどのように?

ありがとうございます!


Craigのアドバイスに従うと、今度は、すべてのアセンブリをロードせずにObjectContextのインスタンスを作成できるようになりました。

ただし、クエリの実行時にすべてのアセンブリを読み込もうとします。下記のスタックトレースをご覧ください:

at System.AppDomain.OnAssemblyResolveEvent(RuntimeAssembly assembly, String assemblyFullName) 
    at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection, Boolean suppressSecurityChecks) 
    at System.Reflection.Assembly.Load(AssemblyName assemblyRef) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.SafeLoadReferencedAssembly(AssemblyName assemblyName) 
    at System.Data.Metadata.Edm.MetadataAssemblyHelper.<GetNonSystemReferencedAssemblies>d__0.MoveNext() 
    at System.Data.Metadata.Edm.ObjectItemCollection.ImplicitLoadViewsFromAllReferencedAssemblies(Assembly assembly) 
    at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedCollectViewsFromReferencedAssemblies(MetadataWorkspace workspace, Dictionary`2 extentMappingViews) 
    at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.SerializedGetGeneratedViews(EntityContainer container) 
    at System.Data.Common.Utils.Memoizer`2.<>c__DisplayClass2.<Evaluate>b__0() 
    at System.Data.Common.Utils.Memoizer`2.Result.GetValue() 
    at System.Data.Common.Utils.Memoizer`2.Evaluate(TArg arg) 
    at System.Data.Mapping.StorageMappingItemCollection.ViewDictionary.GetGeneratedView(EntitySetBase extent, MetadataWorkspace workspace, StorageMappingItemCollection storageMappingItemCollection) 
    at System.Data.Metadata.Edm.MetadataWorkspace.GetGeneratedView(EntitySetBase extent) 
    at System.Data.Query.PlanCompiler.PreProcessor.ExpandView(Node node, ScanTableOp scanTableOp, IsOfOp& typeFilter) 
    at System.Data.Query.PlanCompiler.PreProcessor.ProcessScanTable(Node scanTableNode, ScanTableOp scanTableOp, IsOfOp& typeFilter) 
    at System.Data.Query.PlanCompiler.PreProcessor.Visit(ScanTableOp op, Node n) 
    at System.Data.Query.InternalTrees.ScanTableOp.Accept[TResultType](BasicOpVisitorOfT`1 v, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n) 
    at System.Data.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n) 
    at System.Data.Query.PlanCompiler.SubqueryTrackingVisitor.VisitRelOpDefault(RelOp op, Node n) 
    at System.Data.Query.PlanCompiler.PreProcessor.Visit(ProjectOp op, Node n) 
    at System.Data.Query.InternalTrees.ProjectOp.Accept[TResultType](BasicOpVisitorOfT`1 v, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n) 
    at System.Data.Query.PlanCompiler.SubqueryTrackingVisitor.VisitChildren(Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitDefault(Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfNode.VisitPhysicalOpDefault(PhysicalOp op, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.Visit(PhysicalProjectOp op, Node n) 
    at System.Data.Query.InternalTrees.PhysicalProjectOp.Accept[TResultType](BasicOpVisitorOfT`1 v, Node n) 
    at System.Data.Query.InternalTrees.BasicOpVisitorOfT`1.VisitNode(Node n) 
    at System.Data.Query.PlanCompiler.PreProcessor.Process() 
    at System.Data.Query.PlanCompiler.PreProcessor.Process(PlanCompiler planCompilerState, StructuredTypeInfo& typeInfo) 
    at System.Data.Query.PlanCompiler.PlanCompiler.Compile(List`1& providerCommands, ColumnMap& resultColumnMap, Int32& columnCount, Set`1& entitySets) 
    at System.Data.EntityClient.EntityCommandDefinition..ctor(DbProviderFactory storeProviderFactory, DbCommandTree commandTree) 
    at System.Data.EntityClient.EntityProviderServices.CreateCommandDefinition(DbProviderFactory storeProviderFactory, DbCommandTree commandTree) 
    at System.Data.EntityClient.EntityProviderServices.CreateDbCommandDefinition(DbProviderManifest providerManifest, DbCommandTree commandTree) 
    at System.Data.Common.DbProviderServices.CreateCommandDefinition(DbCommandTree commandTree) 
    at System.Data.Objects.Internal.ObjectQueryExecutionPlan.Prepare(ObjectContext context, DbQueryCommandTree tree, Type elementType, MergeOption mergeOption, Span span, ReadOnlyCollection`1 compiledQueryParameters) 
    at System.Data.Objects.EntitySqlQueryState.GetExecutionPlan(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) 
    at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 

私はさらに助けていただきたいと思います!おかげさまで


*を使用すると、まず現在のアセンブリをチェックする必要があります。 99%の時間が正しいでしょう。すべての単一のアセンブリを読み込んで、現在のアセンブリのみをチェックすることは、私のバグのようです。

すべての単一dllをロードするためにリフレクションを使用することはオプションである必要があります。

私はまだこの問題を抱えています。同社のすべてのビジネスロジックを含むモデルライブラリは、他の場所で使用されています(上記のClickOnceアプリケーションではありません)。このライブラリはCrystalレポートのDLLを参照しています。これにより、EF4はCrystalがインストールされていないためReflectTypeLoadExceptionをスローします。

はい、*ワイルドカードがなく、事前生成されたビューがあります。

本当にEF4にロードする必要がないことを明示的に指示する方法はありません(本当に必要ありません)。そうでなければ、私はEF4を完全に放棄しなければならないように見えます。

答えて

2

ワイルドカード*の代わりにspecify the correct assembly in your EF connection stringを指定する必要があります。

+0

これは意味があります。しかし、dllの名前を指定すると、FileNotFoundExceptionがスローされます。私は、dllの名前が正しいことと、dllがアプリケーションフォルダにあることを100%確信しています。 他にどこが見えるのですか? – Kizedek

+1

'.dll'なしで試してください - アセンブリ名。 –

+0

あなたの助けに感謝クレイグ!私は今ObjectContextを初期化することができます。ただし、クエリが実行されると、再びすべてのアセンブリを読み込もうとします。上記の私の元の投稿を編集してスタックトレースを追加しました。 – Kizedek

関連する問題