Λαμβάνετε προειδοποιητικά μηνύματα πρόγραμμα σύνδεσης κατά τη δημιουργία διαχειριζόμενων επεκτάσεις για C++ DLL έργα

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 814472 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Συμπτώματα

Θα λάβετε ένα από τα ακόλουθα μηνύματα λάθους κατά τη μεταγλώττιση ή κατά το χρόνο σύνδεσης:
Linker Tools Error LNK2001
'μη επιλυμένη εξωτερικό σύμβολο "σύμβολο" '

Εργαλεία πρόγραμμα σύνδεσης προειδοποίηση LNK4210
' Υπάρχει ενότητα .CRT, ενδέχεται να υπάρχουν ανεπίλυτες initializes στατική ή teminators'You λαμβάνουν προειδοποιήσεις σύνδεσμος κατά τη δημιουργία διαχειριζόμενων επεκτάσεις για C++ DLL έργα

Εργαλεία πρόγραμμα σύνδεσης προειδοποίηση LNK4243
'DLL που περιέχει αντικείμενα που έχουν μεταγλωττιστεί με /clr δεν είναι συνδεδεμένο με /NOENTRY; εικόνα μπορεί να μην εκτελούνται σωστά'.
Αυτά τα προειδοποιητικά μηνύματα, ενδέχεται να προκύψουν κατά τις ακόλουθες περιπτώσεις:
  • Όταν κάνετε μεταγλώττιση σύνδεση αντικειμένων με το/CLRΔιακόπτης.
  • Όταν δημιουργείτε ένα από τα ακόλουθα έργα: πρότυπο υπηρεσίας Web ASP.NET, πρότυπο βιβλιοθήκης κλάσης; ή προτύπων βιβλιοθήκης ελέγχου των Windows.
  • Όταν έχετε προσθέσει κώδικα που χρησιμοποιεί καθολικές μεταβλητές ή κλάσεις μητρική (δηλαδή, δεν __gc ή __value) με μέλη στατικά δεδομένα. Για παράδειγμα, το πρότυπο βιβλιοθήκης ActiveX (ATL), Microsoft Foundation Classes (MFC) και οι κλάσεις χρόνου εκτέλεσης C (CRT)
ΣΗΜΕΙΩΣΗ: ενδέχεται να λάβετε τα σφάλματα LNK2001 και LNK4210 με έργα που έχουνNotεπηρεάζεται από το ζήτημα που περιγράφεται σε αυτό το άρθρο. Ωστόσο, το έργο σίγουραείναιεπηρεάζεται από το ζήτημα που περιγράφεται σε αυτό το άρθρο εάν επίλυση προειδοποίηση LNK2001 ή LNK4210 οδηγεί σε μια προειδοποίηση LNK4243 ή εάν η σύνδεση του έργου δημιουργεί μια προειδοποίηση LNK4243.

Αιτία

Τα ακόλουθα έργα δημιουργούνται από προεπιλογή ως μια βιβλιοθήκη δυναμικής σύνδεσης (DLL) χωρίς οποιαδήποτε σύνδεσης σε εγγενή βιβλιοθήκες (όπως το CRT ATL ή MFC) και χωρίς καθολικών μεταβλητών ή κλάσεις μητρική με μέλη στατικά δεδομένα:
  • Πρότυπο υπηρεσίας ASP.NET Web
  • Η κλάση προτύπων βιβλιοθήκης
  • Πρότυπο βιβλιοθήκης ελέγχου των Windows
Εάν προσθέτετε τον κώδικα που χρησιμοποιεί καθολικές μεταβλητές ή κλάσεις μητρική με μέλη στατικά δεδομένα (για παράδειγμα, οι βιβλιοθήκες ATL MFC και CRT χρησιμοποιεί καθολικές μεταβλητές), θα λάβετε μηνύματα λάθους πρόγραμμα σύνδεσης κατά τη μεταγλώττιση. Όταν συμβεί αυτό, πρέπει να προσθέσετε κώδικα για την προετοιμασία με μη αυτόματο τρόπο τις στατικές μεταβλητές. Για περισσότερες πληροφορίες σχετικά με αυτήν τη διαδικασία, ανατρέξτε στην ενότητα "Προτεινόμενη αντιμετώπιση" αυτού του άρθρου.

Για λόγους ευκολίας, αυτό το άρθρο αναφέρεται σε καθολικές μεταβλητές και στατικά δεδομένα μέλη τοπικής κλάσεων ως "statics" ή "στατικές μεταβλητές" από αυτό το σημείο προς τα εμπρός.

Αυτό το ζήτημα προκαλείται από το μεικτό ζήτημα κατά τη φόρτωση του DLL. Μεικτή dll (δηλαδή, των DLL που περιέχει τόσο διαχειριζόμενες όσο και εγγενή κώδικα) μπορεί να αντιμετωπίσετε σενάρια αδιέξοδο, υπό ορισμένες συνθήκες όταν είναι φορτωμένα στη χώρο διεύθυνσης της διεργασίας, ειδικά όταν το σύστημα βρίσκεται υπό καταπόνησης. Το πρόγραμμα σύνδεσης μηνύματα λάθους που αναφέρθηκε προηγουμένως ενεργοποιήθηκαν με το πρόγραμμα σύνδεσης για να βεβαιωθείτε ότι οι πελάτες είναι ενήμερη για την πιθανή αδιέξοδη κατάσταση και τις λύσεις που περιγράφονται σε αυτό το έγγραφο. Για μια λεπτομερή περιγραφή του DLL μεικτή φόρτωση πρόβλημα, εμφανίζεται η ακόλουθη λευκή βίβλο:
Μεικτή φόρτωση του DLL πρόβλημα
.aspx http://msdn2.Microsoft.com/en-us/library/aa290048 (vs.71)

Προτεινόμενη αντιμετώπιση

Διαχείριση επεκτάσεων για έργα C++ που δημιουργούνται ως αρχεία DLL από προεπιλογή δεν συνδεθείτε τοπικά βιβλιοθήκες C/C++, όπως το C βιβλιοθήκη χρόνου εκτέλεσης (CRT), ATL ή MFC και δεν πρέπει να χρησιμοποιείτε τις στατικές μεταβλητές. Επιπλέον, οι ρυθμίσεις του έργου καθορίσετε ότι τα αρχεία DLL πρέπει να συνδεθεί με το/ NOENTRYη επιλογή είναι ενεργοποιημένη.

Αυτό γίνεται επειδή η σύνδεση με ένα σημείο καταχώρησης προκαλεί διαχειριζόμενου κώδικα για εκτέλεση στη διάρκειαDllMain, που δεν είναι ασφαλής (ανατρέξτε στην ενότηταDllMainγια τον περιορισμένο αριθμό πράγματα μπορείτε να το κάνετε στη διάρκεια στο πεδίο εφαρμογής του).

Ένα DLL χωρίς ένα σημείο καταχώρησης δεν έχει τρόπο να προετοιμάσει μεταβλητές στατική εκτός για πολύ απλούς τύπους όπως ακέραιους αριθμούς. Στατικές μεταβλητές δεν χρειάζεται συνήθως ένα/ NOENTRYDLL.

The ATL, MFC and CRT libraries all rely on static variables, so you also cannot use these libraries from within these DLLs without first making modifications.

If your mixed-mode DLL needs to use statics or libraries that depend on statics (such as ATL, MFC, or CRT), then you must modify your DLL so that the statics are manually initialized.

The first step to manual initialization is to make sure that you disable the automatic initialization code, which is unsafe with mixed DLLs and can cause deadlock. To disable the initialization code, follow the steps.

Remove the Entry Point of the Managed DLL

  1. Link with/NOENTRY. ΣτοΕξερεύνηση λύση, right-click the project node, clickΙδιότητες (Properties). ΣτοΣελίδες ιδιοτήτωνπαράθυρο διαλόγου, κάντε κλικ στο κουμπίΠρόγραμμα σύνδεσηςΚάντε κλικΓραμμή εντολών, and then add this switch to theAdditional OptionsΠεδίο (Field).
  2. Linkmsvcrt.lib. ΣτοΣελίδες ιδιοτήτωνπαράθυρο διαλόγου, κάντε κλικ στο κουμπίΠρόγραμμα σύνδεσηςΚάντε κλικΕισαγωγή δεδομένων., and then addmsvcrt.libΓια να τοAdditional DependenciesΙδιότητα.
  3. κατάργησηnochkclr.obj. Στο διακομιστήΕισαγωγή δεδομένωνpage (same page as in the previous step), removenochkclr.objαπό τοAdditional DependenciesΙδιότητα.
  4. Link in the CRT. Στο διακομιστήΕισαγωγή δεδομένωνpage (same page as in the previous step), add__DllMainCRTStartup@12Για να τοForce Symbol ReferencesΙδιότητα.

    If you are using the command prompt, specify the above project settings with the following:
    LINK /NOENTRY msvcrt.lib /NODEFAULTLIB:nochkclr.obj /INCLUDE:__DllMainCRTStartup@12

Modify the Components that Consume the DLL for Manual Initializiation

After you remove the explicit entry point, you must modify components that consume the DLL for manual initialization, depending on the way that your DLL is implemented:
  • Your DLL is entered using DLL exports (__declspec(dllexport)), and your consumers cannot use managed code if they are linked statically or dynamically to your DLL.
  • Your DLL is a COM-based DLL.
  • Consumers of your DLL can use managed code, and your DLL contains either DLL exports or managed entry points.

Modify DLLs That You Enter By Using DLL Exports and Consumers That Cannot Use Managed Code

To modify DLLs that you enter by using dll exports (__declspec(dllexport)) and consumers that cannot use managed code, follow these steps:
  1. Add two new exports to your DLL, as shown in the following code:
    // init.cpp
    
    #include <windows.h>
    #include <_vcclrit.h>
    
    // Call this function before you call anything in this DLL.
    // It is safe to call from multiple threads; it is not reference
    // counted; and is reentrancy safe.
    
    __declspec(dllexport) void __cdecl DllEnsureInit(void)
    {
    	// Do nothing else here. If you need extra initialization steps,
    	// create static objects with constructors that perform initialization.
    	__crt_dll_initialize();
    	// Do nothing else here.
    }
    
    // Call this function after this whole process is totally done
    // calling anything in this DLL. It is safe to call from multiple
    // threads; is not reference counted; and is reentrancy safe.
    // First call will terminate.
    
    __declspec(dllexport) void __cdecl DllForceTerm(void)
    {
    	// Do nothing else here. If you need extra terminate steps, 
    	// use atexit.
    	__crt_dll_terminate();
    	// Do nothing else here.
    }
    
    ΣΗΜΕΙΩΣΗ2005 Visual C++, πρέπει να προσθέσετε το κοινό (επιλογή μεταγλωττιστή υποστήριξη χρόνου εκτέλεσης γλώσσας/CLR:oldSyntax) για να μεταγλωττιστεί με επιτυχία το προηγούμενο δείγμα κώδικα. Για να προσθέσετε το κοινό κατά το χρόνο εκτέλεσης γλώσσας επιλογή μεταγλωττιστή υποστήριξης, ακολουθήστε τα εξής βήματα:
    1. Κάντε κλικΤο έργο, και στη συνέχεια κάντε κλικ στο κουμπίΌνομα_έργουΙδιότητες (Properties).

      ΣΗΜΕΙΩΣΗΌνομα_έργουείναι ένα σύμβολο κράτησης θέσης για το όνομα του έργου.
    2. expandΙδιότητες παραμέτρων, και στη συνέχεια κάντε κλικ στο κουμπίΓενικά.
    3. Στο δεξιό τμήμα του παραθύρου, κάντε κλικ για να επιλέξετεΚοινές υποστήριξης χρόνου εκτέλεσης γλώσσας, παλιά σύνταξη (/ clr:oldSyntax)ΣτοΚοινό υποστήριξη χρόνου εκτέλεσης γλώσσαςρυθμίσεις του έργου.
    4. Κάντε κλικΕφαρμογή, και στη συνέχεια κάντε κλικ στο κουμπίOk.
    Για περισσότερες πληροφορίες σχετικά με το χρόνο εκτέλεσης κοινής γλώσσας του μεταγλωττιστή επιλογές υποστήριξης, επισκεφθείτε την ακόλουθη τοποθεσία της Microsoft Developer Network (MSDN) στο Web:
    http://msdn2.Microsoft.com/en-us/library/k8d11d4s.aspx
    Αυτά τα βήματα ισχύουν για ολόκληρο το άρθρο.
  2. Your DLL can have several consumers. If it does have multiple consumers, add the following code to the DLL .def file in the exports section:
    DllEnsureInit	PRIVATE
    DllForceTerm	PRIVATE
    
    If you do not add these lines, and if you have two DLLs that export functions, the application that links to the DLL will have link errors. Typically, the exported functions have the same names. In a multiconsumer case, each consumer can be linked statically or dynamically to your DLL.
  3. If the consumer is statically linked to the DLL, before you use the DLL the first time, or before you use anything that depends on it in your application, add the following call:
    // Snippet 1
    
    typedef void (__stdcall *pfnEnsureInit)(void);
    typedef void (__stdcall *pfnForceTerm)(void);
    
    {
    	// ... initialization code
    	HANDLE hDll=::GetModuleHandle("mydll.dll");
    	If(!hDll)
    	{
    		// Exit, return; there is nothing else to do.
    	}
    	pfnEnsureInit pfnDll=::( pfnEnsureInit) GetProcAddress(hDll, 
       "DllEnsureInit");
    	if(!pfnDll)
    	{
    		// Exit, return; there is nothing else to do.
    	}
    	
    	pfnDll();
    	
    	// ... more initialization code
    }
    
  4. After the last use of the DLL in your application, add the following code:
    // Snippet 2
    
    {
    	// ... termination code
    	HANDLE hDll=::GetModuleHandle("mydll.dll");
    	If(!hDll)
    	{
    		// exit, return; there is nothing else to do
    	}
    	pfnForceTerm pfnDll=::( pfnForceTerm) GetProcAddress(hDll, 
       "DllForceTerm");
    	if(!pfnDll)
    	{
    		// exit, return; there is nothing else to do
    	}
    	
    	pfnDll();
    	
    	// ... more termination code
    }
    
  5. If the consumer is dynamically linked to the DLL, insert code as follows:
    • Insert snippet 1 (see step 3) immediately after the firstΗ φόρτωση βιβλιοθήκηςfor the DLL .
    • Insert snippet 2 (see step 4) immediately before the lastFreeLibraryfor the DLL.

To Modify COM-based DLL

  • Modify the DLL export functionsDllCanUnloadNow,DllGetClassObject,DllRegisterServerANDDllUnregisterServerόπως φαίνεται στον ακόλουθο κώδικα:
    //  Implementation of DLL Exports.
    
    #include <_vcclrit.h>
    
    STDAPI DllCanUnloadNow(void)
    {
        
        if ( _Module.GetLockCount() == 0 )
    	{
    		__crt_dll_terminate();
            return S_OK;
    	}
        else
        {
            return S_FALSE;
    
        }
    	
    }
    
    STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
    {
        if ( !( __crt_dll_initialize() ) )
    	{
    		return E_FAIL;
    	}
        else
        {
            return _Module.GetClassObject(rclsid, riid, ppv);
        }
    }
    
    STDAPI DllRegisterServer(void)
    {
    	if ( !( __crt_dll_initialize() ) )
    	{
    		return E_FAIL;
    	}
    	// Call your registration code here
        HRESULT hr = _Module.RegisterServer(TRUE)
     
        return hr;
    }
    
    
    STDAPI DllUnregisterServer(void)
    { 
        HRESULT hr = S_OK;
    	__crt_dll_terminate();
    
        // Call your unregistration code here
        hr = _Module.UnregisterServer(TRUE);
        return hr;
    }
    

Τροποποίηση DLL που περιέχουν οι καταναλωτές που χρησιμοποιούν διαχειριζόμενου κώδικα και εξαγωγές DLL ή διαχείρισης των σημείων εισαγωγής

Για να τροποποιήσετε το αρχείο DLL που περιέχει τους καταναλωτές που χρησιμοποιούν διαχειριζόμενο κώδικα και dll εξάγει ή σημεία διαχείρισης εισαγωγής, ακολουθήστε τα εξής βήματα:
  1. Υλοποιεί μια διαχειριζόμενη κλάση με στατικό μέλος λειτουργίες για την προετοιμασία και τον τερματισμό. Προσθήκη αρχείου .cpp στο έργο σας, η υλοποίηση μιας διαχειριζόμενης κλάσης με στατικών μελών για την προετοιμασία και τον τερματισμό:
    // ManagedWrapper.cpp
    
    // This code verifies that DllMain is not automatically called 
    // by the Loader when linked with /noentry. It also checks some
    // functions that the CRT initializes.
    
    #include <windows.h>
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <math.h>
    #include "_vcclrit.h"
    
    #using <mscorlib.dll>
    using namespace System;
    
    public __gc class ManagedWrapper {
    public:
    	static BOOL minitialize() {
    		BOOL retval = TRUE;
    		try {
               retval =  __crt_dll_initialize();
    		} catch(System::Exception* e) {
    			Console::WriteLine(e->Message);
    			retval = FALSE;
    		}
    		return retval;
    	}
    	static BOOL mterminate() {
    		BOOL retval = TRUE;
    		try {
                retval = __crt_dll_terminate();
    		} catch(System::Exception* e) {
    						Console::WriteLine(e->Message);
    			retval = FALSE;
    		}
    		return retval;
    	}
    };
    
    BOOL WINAPI DllMain(HINSTANCE hModule, DWORD dwReason, LPVOID 
    lpvReserved) {
    	Console::WriteLine(S"DllMain is called...");
    	return TRUE;
    } /* DllMain */
    
  2. Η κλήση αυτές τις συναρτήσεις πριν από την αναφορά για το αρχείο DLL και αφού ολοκληρώσετε τη χρήση του. Καλέστε το μέλος της προετοιμασίας και τερματισμού λειτουργίες στο κύριο:
    // Main.cpp
    
    #using <mscorlib.dll>
    using namespace System;
    using namespace System::Reflection;
    #using "ijwdll.dll";
    
    int main() {
    	int retval = ManagedWrapper::minitialize();
        ManagedWrapper::mterminate();
    }
    

Οι χρήστες της Visual C++ .NET 2002

ΣΗΜΕΙΩΣΗ: Αν και δεν υπάρχει πρόγραμμα σύνδεσης μήνυμα λάθους LNK4243 στην έκδοση προϊόντος Visual C++ .NET 2002, οι χρήστες της Visual C++ .NET 2002 είναι συνιστάται να ακολουθήσετε τις οδηγίες που αναφέρθηκαν παραπάνω κατά την ανάπτυξη μεικτών DLL.

Την έκδοση του προϊόντος Visual C++ .NET 2003 περιλαμβάνει μια πρόσθετη κεφαλίδα για να κάνετε πιο εύκολη προετοιμασία με μη αυτόματο τρόπο. Για να κάνετε τις λύσεις που παρατίθενται σε αυτό το άρθρο εργασία με Visual C++ .NET 2002, πρέπει να προσθέσετε ένα αρχείο κεφαλίδων στο έργο σας που ονομάζεται_vcclrit.hμε το ακόλουθο κείμενο:
/***
* _vcclrit.h
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
* Purpose:
*       This file defines the functions and variables used by user
*       to initialize CRT and the dll in IJW scenario.
*
****/

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

extern IMAGE_DOS_HEADER __ImageBase;

BOOL WINAPI _DllMainCRTStartup(
        HANDLE  hDllHandle,
        DWORD   dwReason,
        LPVOID  lpreserved
        );
#ifdef __cplusplus
}
#endif

#ifdef _cplusplus
#define __USE_GLOBAL_NAMESPACE  ::
#else
#define __USE_GLOBAL_NAMESPACE
#endif

// Used to lock 
__declspec( selectany ) LONG  volatile __lock_handle = 0;

// Init called
__declspec(selectany) BOOL volatile __initialized = FALSE;

// Term called
__declspec( selectany ) BOOL volatile __terminated = FALSE;

__inline BOOL WINAPI __crt_dll_initialize()
{
    // Try to make the variable names unique, so that the variables 
    // do not even clash with macros.
    static BOOL volatile (__retval) = FALSE;
    static DWORD volatile (__lockThreadId) = 0xffffffff;
    DWORD volatile (__currentThreadId) = __USE_GLOBAL_NAMESPACE(GetCurrentThreadId)();
    int (__int_var)=0;
    
    // Take Lock; this is needed for multithreaded scenario. 
    // Additionally, the threads need to wait here to make sure that the dll 
    // is initialized when they get past this function.
    while ( __USE_GLOBAL_NAMESPACE(InterlockedExchange)( &(__lock_handle), 1) == 1 )
	{
        ++(__int_var);
        if ((__lockThreadId) == (__currentThreadId)) 
        {
            return TRUE;
        }
		__USE_GLOBAL_NAMESPACE(Sleep)( (__int_var)>1000?100:0 );

        // If you hang in this loop, this implies that your 
        // dllMainCRTStartup is hung on another thread. 
        // The most likely cause of this is a hang in one of your 
        // static constructors or destructors.
	}
    // Note: you do not really need any interlocked stuff here because the 
    // writes are always in the lock. Only reads are outside the lock.
    (__lockThreadId) = (__currentThreadId);
    __try {
        if ( (__terminated) == TRUE )
        {
            (__retval) = FALSE;
        }
        else if ( (__initialized) == FALSE )
        {
            (__retval) = (_DllMainCRTStartup)( ( HINSTANCE )( &__ImageBase ), DLL_PROCESS_ATTACH, 0 );
            (__initialized) = TRUE;
        }

    } __finally {
        // revert the __lockThreadId
        (__lockThreadId) = 0xffffffff;
        // Release Lock
       __USE_GLOBAL_NAMESPACE(InterlockedExchange)(&(__lock_handle),0);
    }
    return (__retval);
}

__inline BOOL WINAPI __crt_dll_terminate()
{
    static BOOL volatile (__retval) = TRUE;
    static DWORD volatile (__lockThreadId) = 0xffffffff;
    DWORD volatile (__currentThreadId) = __USE_GLOBAL_NAMESPACE(GetCurrentThreadId)();
    int (__int_var)=0;
    
    // Take Lock; this lock is needed to keep Terminate 
    // in sync with Initialize.
    while ( __USE_GLOBAL_NAMESPACE(InterlockedExchange)( &(__lock_handle), 1) == 1 )
	{
        ++(__int_var);
        if ((__lockThreadId) == (__currentThreadId)) 
        {
            return TRUE;
        }
		__USE_GLOBAL_NAMESPACE(Sleep)( (__int_var)>1000?100:0 );

        // If you hang in this loop, this implies that your 
        // dllMainCRTStartup is hung on another thread. The most likely 
        // cause of this is a hang in one of your static constructors 
        // or destructors.
    }
    // Note: you do not really need any interlocked stuff here because the 
    // writes are always in the lock. Only reads are outside the lock.
    (__lockThreadId) = (__currentThreadId);
    __try {
        if ( (__initialized) == FALSE )
        {
            (__retval) = FALSE;
        }
        else if ( (__terminated) == FALSE )
        {
            (__retval) = _DllMainCRTStartup( ( HINSTANCE )( &(__ImageBase) ), DLL_PROCESS_DETACH, 0 );
            (__terminated) = TRUE;
        }
    } __finally {
        // revert the __lockThreadId
        (__lockThreadId) = 0xffffffff;
        // Release Lock
       __USE_GLOBAL_NAMESPACE(InterlockedExchange)(&(__lock_handle),0);
    }
    return (__retval);
}

Αναφορές

Για περισσότερες πληροφορίες, κάντε κλικ στον αριθμό του άρθρου παρακάτω, για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
309694BUG: AppDomainUnloaded εξαίρεση κατά τη χρήση της διαχείρισης επεκτάσεων για τα στοιχεία της Visual C++

Ιδιότητες

Αναγν. άρθρου: 814472 - Τελευταία αναθεώρηση: Τετάρτη, 22 Δεκεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Visual C++ 2005 Express Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Λέξεις-κλειδιά: 
kbcominterop kbmanaged kbdll kbijw kbprb kbmt KB814472 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:814472

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com