C#, VB, C++/CLI, MFC 호칭으로 LoggerModule 만들기 노트
'C#','VB','C++/CLI','MFC'를 사용한 프로젝트에서 공통의 Logger를 제작할 때 모듈 간 호출된 tips에 대한 비망록을 총결하였다.
교환과 무관한 부분은 적당히 간소화될 것이다.
『필요요소』
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");
VBsample.vb
Imports Logs.LoggerIF;
...
WriteInfoMessage("test")
C++/CLI, MFCsample.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를 참조합니다.
Reference
이 문제에 관하여(C#, VB, C++/CLI, MFC 호칭으로 LoggerModule 만들기 노트), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kksk/items/8fff270e71bcff32973e텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)