{"id":29,"date":"2007-02-14T20:25:51","date_gmt":"2007-02-14T19:25:51","guid":{"rendered":"http:\/\/blog.m-ri.de\/index.php\/2007\/02\/14\/notwendigkeit-von-manifesten-fur-dlls-mit-vc-2005\/"},"modified":"2008-04-29T08:13:38","modified_gmt":"2008-04-29T06:13:38","slug":"notwendigkeit-von-manifesten-fur-dlls-mit-vc-2005","status":"publish","type":"post","link":"http:\/\/blog.m-ri.de\/index.php\/2007\/02\/14\/notwendigkeit-von-manifesten-fur-dlls-mit-vc-2005\/","title":{"rendered":"Notwendigkeit von Manifesten f\u00fcr DLL&#8217;s mit VC-2005"},"content":{"rendered":"<p>Durch eine Anfrage in meiner Lieblingsgruppe microsoft.public.de.vc bin ich auf folgende interessante Frage gesto\u00dfen: <em>Ben\u00f6tigt eine DLL die mit VC-2005 erzeugt wurde ein Manifest?<\/em><\/p>\n<p>Nun wie viele Antworten im Leben l\u00e4sst sich dies nicht eindeutig mit Ja oder Nein beantworten.<\/p>\n<p>Nein! Es wird kein Manifest ben\u00f6tigt, wenn die CRT statisch gelinkt wird. In diesem Fall wird auch kein Manifest ben\u00f6tigt zumindest nicht f\u00fcr die CRT, was nicht hei\u00dft, dass nicht auch andere Assemblies per Manifest angebunden werden m\u00fcssen.<\/p>\n<p>Nein! Wenn die EXE-Datei bereits \u00fcber ein Manifest verf\u00fcgt und eine CRT-DLL mit gleichem Namen l\u00e4dt, hier also z.B. die MSVCR80.DLL. In diesem Fall kann man sich ein Manifest sparen. Es kann aber hier spannend werden, weil die entsprechende DLL nat\u00fcrlich so nicht beeinflussen kann dir 8.0 CRT als SP1 oder RTM zu nutzen. Aber vermutlich ist das sowieso egal.<\/p>\n<p>Ja! Die DLL ben\u00f6tigt ein Manifest, wenn ein beliebiges Programm die DLL nutzt. Zum Beispiel eines, das die CRT statisch linkt, oder das mit einer \u00e4lteren VC Version erzeugt wurde. In diesem Fall muss die DLL zwingend ein Manifest haben. Und jetzt wird es noch strenger. Wird die DLL per LoadLibrary geladen, dann muss dieses Manifest sogar embedded sein! \ud83d\ude44<br \/>\nExterne Manifeste bei DLLs werden nur beim impliziten Laden ber\u00fccksichtigt. Wird eine DLL mit LoadLibrary geladen, dann werden nur eingebette Manifeste ber\u00fccksichtigt.<\/p>\n<p>\u2757 Falle:\u00a0Hat die DLL kein Manifest wird immer garantiert, dass die CRT Version von EXE und DLL passen. Man kann also gefahrlos Speicher in der DLL allozieren und in der EXE freigeben und umgekehrt. Oder eben auch CRT Objekte austauschen. Nutzt die DLL ein eigenes Manifest besteht die M\u00f6glichekit, dass EXE und DLL eine unterschiedliche CRT verwenden! Und noch spannender wird es wenn eine EXE mit CRTx eine DLL1 benutzt die per Manifest CRTy verwendet und diese nun eine DLL ohne Manifest l\u00e4dt&#8230; Ja es wird die CRT der EXE verwendet&#8230;<\/p>\n<p>Ja ja. Wir haben dank der Manifeste nun keine DLL H\u00f6lle mehr. Wir haben eine Manifest H\u00f6lle \ud83d\ude00<\/p>\n<p>Meine Empfehlung daher:<\/p>\n<ol>\n<li>Wenn es eigenst\u00e4ndige kleine Module sind, dann\u00a0statisch\u00a0gegen die CRT linken.<\/li>\n<li>Ansonsten immer ein Manifest einbetten, wenn die DLL eigenst\u00e4ndig genutzt wird!<\/li>\n<li>Wird die DLL im Kontext einer\u00a0bestimmten EXE(s) Datei verwendet, sollte nur die EXE(s) ein \u00a0Manifest haben.<\/li>\n<li>In jedem Fall darauf achten, dass gleiche CRT Versionen verwendet werden. RTM, SP1\u00a0und irgendwann wahrscheinlich SP2 werden hier Konflikte m\u00f6glich machen.<\/li>\n<li>MFC Extension DLLs m\u00fcssen zwingend mit der selben MFC Version (RTM oder SP1) verwendet werden!<\/li>\n<\/ol>\n<p>Stoff zum weiterlesen:<br \/>\n<a href=\"http:\/\/msdn2.microsoft.com\/en-us\/library\/aa375193.aspx\" title=\"Isolated Applications and Side-by-side Assemblies\">Isolated Applications and Side-by-side Assemblies<\/a><\/p>\n<p>Besonders lesenswert hier der Beitrag von Nicola Dudar:<br \/>\n<a href=\"http:\/\/blogs.msdn.com\/nikolad\/articles\/427101.aspx\" title=\"How to Debug 'The System cannot Execute the specified program' message\">How to Debug &#8218;The System cannot Execute the specified program&#8216; message<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Durch eine Anfrage in meiner Lieblingsgruppe microsoft.public.de.vc bin ich auf folgende interessante Frage gesto\u00dfen: Ben\u00f6tigt eine DLL die mit VC-2005 erzeugt wurde ein Manifest? Nun wie viele Antworten im Leben l\u00e4sst sich dies nicht eindeutig mit Ja oder Nein beantworten. Nein! Es wird kein Manifest ben\u00f6tigt, wenn die CRT statisch gelinkt wird. In diesem Fall &hellip; <a href=\"http:\/\/blog.m-ri.de\/index.php\/2007\/02\/14\/notwendigkeit-von-manifesten-fur-dlls-mit-vc-2005\/\" class=\"more-link\"><span class=\"screen-reader-text\">\u201eNotwendigkeit von Manifesten f\u00fcr DLL&#8217;s mit VC-2005\u201c <\/span>weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[19,4,3,17,2],"tags":[370,360,69,352,358,61],"class_list":["post-29","post","type-post","status-publish","format-standard","hentry","category-crt","category-mfc","category-programmieren","category-vista-2","category-windows-api","tag-c","tag-crt","tag-manifest","tag-mfc","tag-vista","tag-winapi"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/29","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/comments?post=29"}],"version-history":[{"count":0,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/posts\/29\/revisions"}],"wp:attachment":[{"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/media?parent=29"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/categories?post=29"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/blog.m-ri.de\/index.php\/wp-json\/wp\/v2\/tags?post=29"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}