다음을 통해 공유


컴파일러 경고(수준 1) C4691

'type': 참조된 형식이 참조되지 않은 어셈블리 'file'에서 예상되었으며, 대신 사용되는 현재 변환 단위에 정의된 형식입니다.

원래 형식 정의가 포함된 메타데이터 파일은 참조되지 않으며 컴파일러는 로컬 형식 정의를 사용하고 있습니다.

파일을 다시 빌드하는 경우 pragma 경고로 C4691을 무시하거나 해제할 수 있습니다. 즉, 빌드하는 파일이 컴파일러에서 형식 정의를 찾을 것으로 예상되는 파일과 동일한 경우 C4691을 무시할 수 있습니다.

그러나 컴파일러가 메타데이터에서 참조되는 동일한 어셈블리의 정의가 아닌 정의를 사용하는 경우 예기치 않은 동작이 발생할 수 있습니다. CLR 형식은 형식의 이름뿐만 아니라 어셈블리에 의해서도 형식화됩니다. 즉, 어셈블리 z.dll Z 형식은 어셈블리 y.dll Z 형식과 다릅니다.

예제

이 샘플에는 원래 형식 정의가 포함되어 있습니다.

// C4691_a.cpp
// compile with: /clr /LD /W1
public ref class Original_Type {};

이 샘플에서는 C4691_a.dll 참조하고 Original_Type 형식의 필드를 선언합니다.

// C4691_b.cpp
// compile with: /clr /LD
#using "C4691_a.dll"
public ref class Client {
public:
   Original_Type^ ot;
};

다음 샘플에서는 C4691을 생성합니다. 이 샘플에는 Original_Type 대한 정의가 포함되어 있으며 C4691a.dll 참조하지 않습니다.

해결하려면 원래 형식 정의가 포함된 메타데이터 파일을 참조하고 로컬 선언 및 정의를 제거합니다.

// C4691_c.cpp
// compile with: /clr /LD /W1
// C4691 expected

// Uncomment the following line to resolve.
// #using "C4691_a.dll"
#using "C4691_b.dll"

// Delete the following line to resolve.
ref class Original_Type;

public ref class MyClass : Client {};