2010-12-07 67 views
2

J'ai un assembly nommé fort contenant des classes Model pouvant être partagées entre plusieurs applications (WCF Services dans IIS) hébergées sur la même machine. Au lieu de chaque service ayant leur propre copie de cette DLL dans le dossier Bin, je veux l'ajouter à GAC.Impossible d'enregistrer l'assembly dans GAC pour .NET4, Server 2008 R2

J'utilise un gacutil.exe pour .NET4: Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.1 Copyright (c) Microsoft Corporation. All rights reserved.

La DLL est enregistrée dans GAC, mais se retrouve dans C:\Windows\Assembly (GAC 2.0) - pas C:\Windows\Microsoft.NET\Assembly (GAC 4).

Quand j'enregistrer la DLL dans le GAC et le retirer du dossier Bin, mes applications échouent avec:

Could not load file or assembly 'MyCompany.Enterprise.BOM' or one of its dependencies. The system cannot find the file specified. at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection, Boolean suppressSecurityChecks)...

Note: Server 2008 R2 64 bits, l'assemblage est construit pour MSIL, .NET 4.0. J'utilise gacutil.exe qui est livré avec Windows SDK v7.1 et est dans le dossier NETFX 4.0 Tools.

Que puis-je manquer? Je ne peux pas penser à des alternatives, donc les idées sont les bienvenues.

EDIT (Manifest):

// Metadata version: v2.0.50727 
.assembly extern mscorlib 
{ 
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)       // .z\V.4.. 
    .ver 2:0:0:0 
} 
.assembly extern System.Runtime.Serialization 
{ 
    .publickeytoken = (B7 7A 5C 56 19 34 E0 89)       // .z\V.4.. 
    .ver 3:0:0:0 
} 
.assembly HCS.Enterprise.BOM 
{ 
    .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = (01 00 24 63 31 34 64 39 31 65 32 2D 30 35 31 65 // ..$c14d91e2-051e 
                            2D 34 66 65 31 2D 38 62 37 30 2D 61 36 36 33 66 // -4fe1-8b70-a663f 
                            39 61 37 62 34 33 35 00 00)      // 9a7b435.. 
    .custom instance void [mscorlib]System.Reflection.AssemblyKeyFileAttribute::.ctor(string) = (01 00 20 43 3A 5C 48 43 53 2E 45 6E 74 65 72 70 // .. C:\HCS.Enterp 
                           72 69 73 65 5C 4B 65 79 5C 48 43 53 4B 65 79 2E // rise\Key\HCSKey. 
                           73 6E 6B 00 00)         // snk.. 

    // --- The following custom attribute is added automatically, do not uncomment ------- 
    // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = (01 00 02 00 00 00 00 00) 

    .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = (01 00 08 00 00 00 00 00) 
    .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = (01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx 
                              63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01)  // ceptionThrows. 
    .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = (01 00 07 31 2E 30 2E 30 2E 30 00 00)    // ...1.0.0.0.. 
    .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = (01 00 12 48 43 53 2E 45 6E 74 65 72 70 72 69 73 // ...HCS.Enterpris 
                           65 2E 42 4F 4D 00 00)       // e.BOM.. 
    .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = (01 00 00 00 00) 
    .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = (01 00 00 00 00) 
    .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = (01 00 0E 48 6F 72 69 7A 6F 6E 2D 42 43 42 53 4E // ...HN 
                           4A 00 00)          // J.. 
    .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = (01 00 12 48 43 53 2E 45 6E 74 65 72 70 72 69 73 // ...HCS.Enterpris 
                           65 2E 42 4F 4D 00 00)       // e.BOM.. 
    .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = (01 00 20 43 6F 70 79 72 69 67 68 74 20 C2 A9 20 // .. Copyright .. 
                            48 6F 72 69 7A 6F 6E 2D 42 43 42 53 4E 4A 20 32 // H2 
                            30 31 30 00 00)         // 010.. 
    .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = (01 00 00 00 00) 
    .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = (01 00 00 00 00) 
    .publickey = (00 24 00 00 04 80 00 00 94 00 00 00 06 02 00 00 // .$.............. 
       00 24 00 00 52 53 41 31 00 04 00 00 01 00 01 00 // .$..RSA1........ 
       3B 65 DD 3B C7 49 A7 F4 C9 50 BE 27 F9 62 B6 54 // ;e.;.I...P.'.b.T 
       D1 26 7B DC 5B EF C1 02 59 E8 77 D4 3D F5 2F 50 // .&{.[...Y.w.=./P 
       94 22 AC C3 B7 07 71 A4 99 D4 FF 10 ED 05 6D 70 // ."....q.......mp 
       9A 9D 99 DC 33 1F 8A 3F A5 77 2E C5 5F 9D 35 15 // ....3..?.w.._.5. 
       BA 54 47 47 C2 8B 13 8C 57 57 C6 1E F5 AB 7B D5 // .TGG....WW....{. 
       B8 87 DD 4A F3 69 01 B2 6B C8 88 99 04 09 19 FC // ...J.i..k....... 
       5E 51 7E 2A B9 B5 03 80 C9 A3 EA ED EF B8 EC BF // ^Q~*............ 
       EB 97 30 EC D9 E4 36 7C 0F 64 B7 27 9D 29 0D C5) // ..0...6|.d.'.).. 
    .hash algorithm 0x00008004 
    .ver 1:0:0:0 
} 
.module HCS.Enterprise.BOM.dll 
// MVID: {D4D8B566-6B0D-4F8D-ABD4-C3A1339B4F84} 
.imagebase 0x00400000 
.file alignment 0x00000200 
.stackreserve 0x00100000 
.subsystem 0x0003  // WINDOWS_CUI 
.corflags 0x00000009 // ILONLY 
// Image base: 0x031B0000 
+0

Pouvez-vous s'il vous plaît jeter un oeil à l'assemblée avec ildasm.exe et afficher le début du manifeste ici? – TToni

+0

@TToni - Je vois le manifeste a des métadonnées pour v2.0 - comment puis-je le changer pour être 4.0? Est-ce que c'est quelque chose généré au moment de la compilation? – Leon

Répondre

1

Comme on peut le voir sur le manifeste, la DLL est une version d'exécution 2.0, même le gacutil de 4,0 placera dans le 2.0 GAC. Le manifeste est créé au moment de la compilation. Il doit donc y avoir un problème avec votre projet et/ou les paramètres de compilation.

Je suppose que vous utilisez Visual Studio, vérifiez donc les paramètres projets (pas de solutions) dans l'onglet Application.

+0

Merci! C'était tout - le projet a été configuré pour cibler .NET 3.5. DLL fonctionne correctement sur une machine avec seulement .NET 4.0 installé mais doit être dans le dossier Bin. Il est partagé entre les applications .NET2 et .NET3.5 et .NET4 et doit donc rester en tant que .NET 2.0. – Leon