archive 삭제
This commit is contained in:
@@ -1,103 +0,0 @@
|
||||
[ComVisible(true)] : COM Interface에 등록할 수 있도록 보이게 함.
|
||||
(요걸 하면 regasm 명령어로 등록이 가능해짐)
|
||||
``` c#
|
||||
[
|
||||
ComVisible(true),
|
||||
Guid("4f84b96c-d3d9-4b14-ae3a-bbea2bc6a7f8"),
|
||||
ClassInterface(ClassInterfaceType.AutoDispatch),
|
||||
]
|
||||
```
|
||||
위 세가지는 COM에 노출되기위해 반드시 있어야하는 옵션들임.
|
||||
```c#
|
||||
[ComVisible(true)]
|
||||
[ClassInterface(ClassInterfaceType.None)]
|
||||
[ProgId("kr.co.aim.iobridge.secs.service.DriverInstance")]
|
||||
public class DriverInstance
|
||||
{ ... 생략
|
||||
```
|
||||
위의 과정을 거치고 build하면 TLB도 같이 떨어짐.
|
||||
|
||||
Assembly 등록 (COM에 dll 등록)
|
||||
```bash
|
||||
regasm /codebase .\CSLib.dll
|
||||
|
||||
regasm /u /codebase .\CSLib.dll
|
||||
```
|
||||
|
||||
|
||||
RAD Studio ( 델파이 프로젝트에 TBL 등록 )
|
||||
![[Pasted image 20240206150810.png]]
|
||||
|
||||
|
||||
Chat GPT
|
||||
Q: 프로젝트에 TLB도 추가되어 있어야하고 레지스트리에도 추가가 되어있어야 하는거야?
|
||||
A: COM 객체를 사용하는 Delphi 프로젝트에서는 해당 COM 객체의 Type Library(TLB)를 프로젝트에 추가하고, 레지스트리에도 등록되어 있어야 합니다.
|
||||
|
||||
|
||||
![[Pasted image 20240206150030.png]]
|
||||
![[Pasted image 20240206150106.png]]
|
||||
|
||||
Class를 그대로 쓰기보다는 Interface를 만들어서 쓰는게 조금 더 호환성이 좋은 것 같긴함.
|
||||
|
||||
```c#
|
||||
[
|
||||
ComVisible(true),
|
||||
Guid("c5a0e65b-c891-47f4-9610-297314a6e22a"),
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown)
|
||||
]
|
||||
public interface ICallback
|
||||
{
|
||||
void OnConnection(ConnectionInfo connStatus);
|
||||
void OnMessageReceived(ReceivedInfo receivedInfo);
|
||||
void OnMessageSendFinished(SendFinishInfo sendInfo);
|
||||
void OnDriverEvent(DriverEventInfo driverEvent);
|
||||
}
|
||||
```
|
||||
|
||||
c#에서 COM 호환가능한 Interface를 만들려면 (혹은 만들어주려면)
|
||||
InterfaceType(ComInterfaceType.InterfaceIsIUnknown) 이 문구가 반드시 필요함.
|
||||
|
||||
|
||||
|
||||
- **32비트 DLL을 64비트 레지스트리에 등록할 때:**
|
||||
|
||||
- `HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Interface\`
|
||||
- **32비트 DLL을 32비트 레지스트리에 등록할 때:**
|
||||
|
||||
- `HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Classes\Interface\`
|
||||
|
||||
인터페이스는 regasm 이 등록해주지 않는 것 같다.
|
||||
Visual Stuido 에서 COM Interop 등록 체크해놓고 빌드하면
|
||||
이때는 VS가 인터페이스도 등록을 해주는 것 같음.
|
||||
이 때, AnyCPU로 빌드를 하면 인터페이스는 wow6432node의 하위 interface 디렉토리에 추가해준다.
|
||||
x86으로 빌드하면 추가가.. 안되나?;; 아에 추가가 안된다.
|
||||
|
||||
cmd에서 바로 등록하려면 /tlb 옵션넣으면 된다.
|
||||
|
||||
.tlb 파일은 남에게 줘도 아무 의미가 없을 듯 하다.
|
||||
dll 가지고 각자 알아서 tlb를 만들어야 만드는 과정에서 그 환경에 맞는 레지스트리 위치에
|
||||
interface 등록을 하기 떄문이다.
|
||||
|
||||
|
||||
|
||||
/HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/==Classes==/Interface/{C5A0E65B-C891-47F4-9610-297314A6E22A}
|
||||
|
||||
/HKEY_LOCAL_MACHINE/SOFTWARE/WOW6432Node/Interface/{C5A0E65B-C891-47F4-9610-297314A6E22A}
|
||||
|
||||
두개의 경로가 있는데..? 왜지..?
|
||||
둘 중 하나만 지워도 둘 다 사라짐..;;
|
||||
|
||||
인터페이스는 HKEY_LOCAL_MACHINE 하위에 등록해서 쓰는 거 같고
|
||||
클래스는 HKEY_CLASSES_ROOT 하위에 등록해서 쓰는 것 같다.
|
||||
|
||||
TLB는 32비트, 64비트 와 상관이 없다.
|
||||
dll은 각각 비트의 regasm 명령어로 각각 dll을 추가해줘야한다.
|
||||
( 안해주면 잘못된 클래스 문자열입니다. 에러 발생함 )
|
||||
|
||||
|
||||
c#에서 델파이 함수를 Interface로 호출할 때 stdcall 붙여주는거..
|
||||
안붙이면 x86에서 안됐음
|
||||
|
||||
|
||||
tlb 파일 만들 때 regasm.exe를 x86 버전으로 사용해야함. x64꺼로 사용해서 만든 tlb는
|
||||
rad studio에 등록이 안됨. ( 이유는 모르겠음, successfuly 라고 뜨는데 등록은 안됨. 버그같기도 함 )
|
||||
@@ -1,3 +0,0 @@
|
||||
Heap Dump를 뜨고 분석해서 메모리 누수를 찾았었음
|
||||
|
||||
[[Heap Dump]]
|
||||
@@ -1,105 +0,0 @@
|
||||
for IOBridge_SECS java
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<Configuration>
|
||||
<CustomLevels>
|
||||
<CustomLevel name="RAW_R" intLevel="1001"/>
|
||||
<CustomLevel name="RAW_S" intLevel="1002"/>
|
||||
<CustomLevel name="SECS_R" intLevel="1011"/>
|
||||
<CustomLevel name="SECS" intLevel="1012"/>
|
||||
<CustomLevel name="SECS_S" intLevel="1013"/>
|
||||
<CustomLevel name="SECS_DATA_R" intLevel="1021"/>
|
||||
<CustomLevel name="SECS_DATA" intLevel="1022"/>
|
||||
<CustomLevel name="SECS_DATA_S" intLevel="1023"/>
|
||||
<CustomLevel name="DRIVER" intLevel="1031"/>
|
||||
</CustomLevels>
|
||||
<Properties>
|
||||
|
||||
</Properties>
|
||||
<Appenders>
|
||||
<RollingFile name="raw" immediateFlush="true">
|
||||
<FileName>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/RawByte/${ctx:DEVICEID}_RawByte.log</FileName>
|
||||
<FilePattern>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/RawByte/${ctx:DAY_PATTERN}/${ctx:FILE_PATTERN}_RawByte_%i.log</FilePattern>
|
||||
<PatternLayout pattern="%d{[HH:mm:ss.SSS]}%m%n"/>
|
||||
<Policies>
|
||||
<!-- size 단위: Byte(default), KB, MB, or GB -->
|
||||
<SizeBasedTriggeringPolicy>
|
||||
<size>${ctx:MAX_FILE_SIZE}</size>
|
||||
</SizeBasedTriggeringPolicy>
|
||||
<!-- interval(default 1)이므로 1초 간격으로 rolling 수행 -->
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<LevelRangeFilter minLevel="RAW_R" maxLevel="RAW_S" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<DefaultRolloverStrategy max="999"/>
|
||||
</RollingFile>
|
||||
<Async name="AsyncRawAppender">
|
||||
<AppenderRef ref="raw"/>
|
||||
</Async>
|
||||
|
||||
<RollingFile name="secs" immediateFlush="true">
|
||||
<FileName>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/SECS_Header/${ctx:DEVICEID}_SECS_Header.log</FileName>
|
||||
<FilePattern>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/SECS_Header/${ctx:DAY_PATTERN}/${ctx:FILE_PATTERN}_SECS_Header_%i.log</FilePattern>
|
||||
<PatternLayout pattern="%d{[HH:mm:ss.SSS]}%m%n"/>
|
||||
<Policies>
|
||||
<!-- size 단위: Byte(default), KB, MB, or GB -->
|
||||
<SizeBasedTriggeringPolicy>
|
||||
<size>${ctx:MAX_FILE_SIZE}</size>
|
||||
</SizeBasedTriggeringPolicy>
|
||||
<!-- interval(default 1)이므로 1초 간격으로 rolling 수행 -->
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<LevelRangeFilter minLevel="SECS_R" maxLevel="SECS_S" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<DefaultRolloverStrategy max="999"/>
|
||||
</RollingFile>
|
||||
<Async name="AsyncSECSAppender">
|
||||
<AppenderRef ref="secs"/>
|
||||
</Async>
|
||||
|
||||
<RollingFile name="secsdata" immediateFlush="true">
|
||||
<FileName>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/SECS_Data/${ctx:DEVICEID}_SECS_Data.log</FileName>
|
||||
<FilePattern>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/SECS_Data/${ctx:DAY_PATTERN}/${ctx:FILE_PATTERN}_SECS_Data_%i.log</FilePattern>
|
||||
<PatternLayout pattern="%d{[HH:mm:ss.SSS]}%m%n"/>
|
||||
<Policies>
|
||||
<!-- size 단위: Byte(default), KB, MB, or GB -->
|
||||
<SizeBasedTriggeringPolicy>
|
||||
<size>${ctx:MAX_FILE_SIZE}</size>
|
||||
</SizeBasedTriggeringPolicy>
|
||||
<!-- interval(default 1)이므로 1초 간격으로 rolling 수행 -->
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<LevelRangeFilter minLevel="SECS_DATA_R" maxLevel="SECS_DATA_S" onMatch="ACCEPT" onMismatch="DENY"/>
|
||||
<DefaultRolloverStrategy max="999"/>
|
||||
</RollingFile>
|
||||
<Async name="AsyncSECSDataAppender">
|
||||
<AppenderRef ref="secsdata"/>
|
||||
</Async>
|
||||
|
||||
<RollingFile name="driver" immediateFlush="true">
|
||||
<FileName>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/Driver/${ctx:DEVICEID}_Driver.log</FileName>
|
||||
<FilePattern>${ctx:APP_LOG_ROOT}/${ctx:DEVICEID}/Driver/${ctx:DAY_PATTERN}/${ctx:FILE_PATTERN}_Driver_%i.log</FilePattern>
|
||||
<PatternLayout pattern="%d{[HH:mm:ss.SSS]}[%-5p] - %m%n"/>
|
||||
<Policies>
|
||||
<!-- size 단위: Byte(default), KB, MB, or GB -->
|
||||
<SizeBasedTriggeringPolicy>
|
||||
<size>${ctx:MAX_FILE_SIZE}</size>
|
||||
</SizeBasedTriggeringPolicy>
|
||||
<!-- interval(default 1)이므로 1초 간격으로 rolling 수행 -->
|
||||
<TimeBasedTriggeringPolicy interval="1" modulate="true"/>
|
||||
</Policies>
|
||||
<!-- <LevelRangeFilter minLevel="ERROR" maxLevel="INFO" onMatch="ACCEPT" onMismatch="DENY"/> -->
|
||||
<DefaultRolloverStrategy max="999"/>
|
||||
</RollingFile>
|
||||
<Async name="AsyncDriverAppender">
|
||||
<AppenderRef ref="driver"/>
|
||||
</Async>
|
||||
</Appenders>
|
||||
<Loggers>
|
||||
<Logger Level="ALL" additivity="false" name="kr.co.aim.iobridge.secs.logger">
|
||||
<AppenderRef ref="AsyncRawAppender"/>
|
||||
<AppenderRef ref="AsyncSECSAppender"/>
|
||||
<AppenderRef ref="AsyncSECSDataAppender"/>
|
||||
<AppenderRef ref="AsyncDriverAppender"/>
|
||||
</Logger>
|
||||
</Loggers>
|
||||
</Configuration>
|
||||
```
|
||||
@@ -1,88 +0,0 @@
|
||||
```xml
|
||||
<log4net>
|
||||
<appender name="RAW" type="log4net.Appender.RollingFileAppender">
|
||||
<file value="${ctx:APP_LOG_ROOT}\${ctx:DEVICEID}\Raw\" />
|
||||
<appendToFile value="true" />
|
||||
<maximumFileSize value="10MB" />
|
||||
<rollingStyle value ="Composite" />
|
||||
<maxSizeRollBackups value="999"/>
|
||||
<datePattern value="${ctx:DATE_PATTERN}\\${ctx:FILE_PATTERN}'-RawByte.log'"/>
|
||||
<preserveLogFileNameExtension value="true" />
|
||||
<encoding value="utf-8" />
|
||||
<staticLogFileName value="false" />
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="[%d{HH:mm:ss.fff}][%-5p] - %m%n" />
|
||||
</layout>
|
||||
<immediateFlush value="true"/>
|
||||
</appender>
|
||||
|
||||
<appender name="SECS" type="log4net.Appender.RollingFileAppender">
|
||||
<file value="${ctx:APP_LOG_ROOT}\${ctx:DEVICEID}\SECS_Header\" />
|
||||
<appendToFile value="true" />
|
||||
<maximumFileSize value="10MB" />
|
||||
<rollingStyle value ="Composite" />
|
||||
<maxSizeRollBackups value="999"/>
|
||||
<datePattern value="${ctx:DATE_PATTERN}\\${ctx:FILE_PATTERN}'-SECS_Header.log'"/>
|
||||
<preserveLogFileNameExtension value="true" />
|
||||
<encoding value="utf-8" />
|
||||
<staticLogFileName value="false" />
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="[%d{HH:mm:ss.fff}][%-5p] - %m%n" />
|
||||
</layout>
|
||||
<immediateFlush value="true"/>
|
||||
</appender>
|
||||
|
||||
<appender name="SECSDATA" type="log4net.Appender.RollingFileAppender">
|
||||
<file value="${ctx:APP_LOG_ROOT}\${ctx:DEVICEID}\SECS_Data\" />
|
||||
<appendToFile value="true" />
|
||||
<maximumFileSize value="10MB" />
|
||||
<rollingStyle value ="Composite" />
|
||||
<maxSizeRollBackups value="999"/>
|
||||
<datePattern value="${ctx:DATE_PATTERN}\\${ctx:FILE_PATTERN}'-SECS_Data.log'"/>
|
||||
<preserveLogFileNameExtension value="true" />
|
||||
<encoding value="utf-8" />
|
||||
<staticLogFileName value="false" />
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="[%d{HH:mm:ss.fff}][%-5p] - %m%n" />
|
||||
</layout>
|
||||
<immediateFlush value="true"/>
|
||||
</appender>
|
||||
|
||||
<appender name="DRIVER" type="log4net.Appender.RollingFileAppender">
|
||||
<file value="${ctx:APP_LOG_ROOT}\${ctx:DEVICEID}\Driver\" />
|
||||
<appendToFile value="true" />
|
||||
<maximumFileSize value="10MB" />
|
||||
<rollingStyle value ="Composite" />
|
||||
<maxSizeRollBackups value="999"/>
|
||||
<datePattern value="${ctx:DATE_PATTERN}\\${ctx:FILE_PATTERN}'-Driver.log'"/>
|
||||
<preserveLogFileNameExtension value="true" />
|
||||
<encoding value="utf-8" />
|
||||
<staticLogFileName value="false" />
|
||||
<layout type="log4net.Layout.PatternLayout">
|
||||
<conversionPattern value="[%d{HH:mm:ss.fff}][%-5p] - %m%n" />
|
||||
</layout>
|
||||
<immediateFlush value="true"/>
|
||||
</appender>
|
||||
|
||||
<logger name="IOBridge_SECS.RAW" additivity="false">
|
||||
<level value="ALL" />
|
||||
<appender-ref ref="RAW" />
|
||||
</logger>
|
||||
|
||||
<logger name="IOBridge_SECS.SECS" additivity="false">
|
||||
<level value="ALL" />
|
||||
<appender-ref ref="SECS" />
|
||||
</logger>
|
||||
|
||||
<logger name="IOBridge_SECS.SECSDATA" additivity="false">
|
||||
<level value="ALL" />
|
||||
<appender-ref ref="SECSDATA" />
|
||||
</logger>
|
||||
|
||||
<logger name="IOBridge_SECS.DRIVER" additivity="false">
|
||||
<level value="ALL" />
|
||||
<appender-ref ref="DRIVER" />
|
||||
</logger>
|
||||
|
||||
</log4net>
|
||||
```
|
||||
@@ -1 +0,0 @@
|
||||
![[Pasted image 20240206150416.png]]
|
||||
@@ -1,5 +0,0 @@
|
||||
[[Jplag]] 로 비교함. 최초 99% -> 60%대까지 줄였다가
|
||||
새로 개발하자로 노선이 변경되어 (4월경) 새롭게 개발함
|
||||
|
||||
최종적으로 20%대 후반이 나왔지만 이정도면
|
||||
다른소스나 다를 바 없다고 판단할 수 있을 듯 함.
|
||||
@@ -1,2 +0,0 @@
|
||||
레지스트리 경로에서 불필요한 경로를 지워버리고 엔터때리면
|
||||
알아서 바뀜
|
||||
Reference in New Issue
Block a user