2011-08-02 5 views
2

동적 어셈블리로드와 함께 ClickOnce를 사용합니다. 최근 솔루션의 "모델"프로젝트에 EF4 모델을 추가했습니다.EF4가 모든 어셈블리를 동적으로로드하는 것을 방지하는 방법

응용 프로그램은 연결 문자열에 app.config 파일을 사용하면 안되므로 EntityConnection을 사용하여 ObjectContext를 만듭니다.

ClickOnce를 사용하여 응용 프로그램을 배포 할 때 ObjectContext의 인스턴스를 만들면 응용 프로그램 논리가 완벽하게 작동하지만 EF4는 관련된 모든 어셈블리를 동적으로로드하여 메타 데이터를 찾습니다.

이렇게하면 clickonce가 clickonce dll 맵에서 모든 어셈블리를 다운로드하도록합니다!

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을 방지 할 수 있습니다 : 여기

는 스택 추적은 ObjectContext는의의 ctor를 호출 할 때?

감사합니다.


크레이그의 조언을 따른 후 나는 지금은 모든 어셈블리를로드하려고하지 않고 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 어플리케이션은 아님). 이 라이브러리는 크리스털 보고서 DLL을 참조하여 EF4가 크리스탈이 설치되어 있지 않기 때문에 ReflectTypeLoadException을 발생시킵니다.

네, 여기에는 와일드 카드가없고 미리 생성 된보기가 있습니다.

실제로 EF4에로드하지 않을 어셈블리를 명시 적으로 알릴 방법이 없을까요? (정말로 필요하지 않습니다)? 그렇지 않으면 EF4를 완전히 버려야 할 것처럼 보입니다.

답변

2

와일드 카드 * 대신 specify the correct assembly in your EF connection string을 입력해야합니다.

+0

의미가 있습니다. 그러나 dll 이름을 지정하면 FileNotFoundException이 발생합니다. 나는 dll 이름이 정확하고 dll이 응용 프로그램 폴더에 있는지 100 % 확신합니다. 어디에서 볼 수 있습니까? – Kizedek

+1

어셈블리 이름'.dll '없이 시험해보십시오. –

+0

도움 주셔서 감사합니다. Craig! 이제 ObjectContext를 초기화 할 수 있습니다. 그러나 쿼리를 실행하면 다시 모든 어셈블리를로드하려고 시도합니다.위의 원본 게시물을 편집하여 스택 추적을 포함 시켰습니다. – Kizedek

관련 문제