C#, VB, C++/CLI, MFC 호칭으로 LoggerModule 만들기 노트

6497 단어 MFCVBC#C++
이 보도는?
'C#','VB','C++/CLI','MFC'를 사용한 프로젝트에서 공통의 Logger를 제작할 때 모듈 간 호출된 tips에 대한 비망록을 총결하였다.
교환과 무관한 부분은 적당히 간소화될 것이다.
『필요요소』
  • IF 범용
  • 파일 이름, 함수 이름, 줄 수를 무단으로 표시
  • 누구를 향해?
  • C#와 VB의 솔루션에 MFC의 옛 비전의 소스를 넣어야 하는 비참한 규정의 사람
  • 로그 출력 초보자?
  • 전체관

    LogModule
    C+/CLI를 사용하여 생성합니다.
    C#, VB 또는 C++/CLI, MFC 모두에서 불러야 하기 때문입니다.
    이번 말과는 전혀 상관없이 썼어요NLog.
    Logger.cpp
    void CLogger::WriteInfoMessage(String^ message, String^ file, String^ func, int line)
    {
        CLogger::Initialize();
        CLogger::logger->WriteLog(Loglv::Info, message, file, func, line);
    }
    
    <간단한 설명>
    너무 비전의 출처라 처음에는 어디를 거쳐야 할지 전혀 알 수 없었기 때문에 모든 외부 IF에는 실례 제작 등 이니티브가 첨부돼 있었다.
    WriteLog 내에서 정보를 포맷하고 Nlog의 인스턴스를 Info 메서드라고 합니다.
    C#, VB용 IF
    "C#"로 제작.
    LogModule의 dll 항목을 찾습니다.
    LoggerIF.cs
    public static void WriteInfoMessage(
        string message,
        [CallerFilePath]string file = "",
        [CallerMemberName]string func = "",
        [CallerLineNumber]int line = 0)
    {
        Logger.WriteInfoMessage(message, file, func, line);
    }
    
    
    <간단한 설명>
    속성 이름
    효과
    CallerFilePath
    원본 파일 이름 가져오기
    CallerMemberPath
    호출 소스 함수 이름 가져오기
    CallerLineNumber
    호출 줄 수 가져오기
    LogModule의 WriteInfoMessage 등 Log 출력 함수를 직접 호출합니다.
    C++/CLI, MFC용 헤드 파일
    LogModule, C++/CLI 프로젝트, MFC 프로젝트 공유
    LoggerIF.h
    #ifdef LOGDLL_EXPORTS
    #define LOGDLL_API __declspec(dllexport) 
    #else
    #define LOGDLL_API __declspec(dllimport) 
    #endif
    
    #define WriteInfoMessage(message) _WriteInfoMessage(message, __FILE__, __FUNCTION__, __LINE__)
    
    extern "C" {
        LOGDLL_API void _WriteInfoMessage(const char* message, const char* file, const char* func, int line);
    }
    
    <간단한 설명>
    정의 이름
    효과
    __FILE__
    원본 파일 이름 가져오기
    __FUNCTION__
    호출 소스 함수 이름 가져오기
    __LINE__
    호출 줄 수 가져오기
    Define로 WriteInfoMessage를 정의하고 파일 이름 등을 추가로 얻어 extern "C"의 내부 함수에 건네줍니다.
    또한 LogModule 내의 로그 출력 클래스에서 제목 Include 시 LOGDLLEXPORTS를 정의하여 호출자/호출자의 dllimport/dlleexport를 분리합니다.(결정 완료)
    Logger.cpp
    #include "Logger.h"
    #define LOGDLL_EXPORTS
    
    부분 호출
    C#
    sample.cs
    using static Logs.LoggerIF;
    ...
        WriteInfoMessage("test");
    
    VB
    sample.vb
    Imports Logs.LoggerIF;
    ...
        WriteInfoMessage("test")
    
    C++/CLI, MFC
    sample.cpp
    
    #include "LoggerIF.h"
    ...
        WriteInfoMessage("test");
    
    타협점
    LogModule이 있는 C++/CLI에도 Caller FilePath 등이 존재하기 때문에 C#, VB를 사용하지 않고 IF로 C# 측면에서 LogiModule를 직접 호출하는 것은 당연하다.
    그러나 VB에서 호출되더라도 파일 이름 등은 입력되지 않았다.
    아마도 중간 코드를 VB로 수정할 때 VB의 규격에 맞게 초기 값을 설정하지 않으면 뒤에서 Nothing을 입력하도록 강제할 것 같습니다.Caller MemberPath 등은 값을 설정한 상태에서 무시되기 때문에 결과적으로 파일 이름이 입력되지 않는 것은 아니다.
    Optionaal Attribute와DefaultValue 등은 시도해도 제대로 이뤄지지 않아 단념했다.따라서 C#은 IF를 만들고 있습니다.
    대처법을 알았다면 이 IF는 필요 없었을 것이다.
    C#측에서 초기값 문제가 발생하지 않기 때문에 LogModule를 직접 호출해도 문제가 없습니다. 어쨌든 C#측에서 IF를 제작하면 참고하지 않을 이유가 없기 때문에 C#측에서도 이 IF를 참조합니다.

    좋은 웹페이지 즐겨찾기