닫힌 소스 관리되지 않는 DLL을 C++로 코딩하여 C# 솔루션에서 사용하려고 했으므로 P/Invoke를 사용하여 닫힌 소스 DLL 함수를 호출하는 래퍼 관리 DLL을 만들었습니다. 이것은 param 함수와 int 변수가 없어도 잘 작동합니다. 그러나 System.ExecutionEngineException 문자열의 문자 배열을 포함하는 매개 변수로 구조체의 배열을 사용하여 더 복잡한 함수를 실행할 때 가져옵니다. 여기에 내가 가진 무엇 :P/Invoke throw System.ExecutionEngineException
이#define TARGET_LBL_SIZE (256l)
typedef struct _tyrfdeTarget
{
TInt32 TargetID; // integer signed 32bits
TCharA Label[TARGET_LBL_SIZE]; // caracter
} tyrfdeTarget;
TInt32 __stdcall tyrfdeGetTargets(tyrfdeTarget* pTargets);
배열 크기가 어쨌든 SizeConst 긴하지만로 지정된 이유를 확신뿐만 아니라 걸릴 : 아래
[StructLayout(LayoutKind.Sequential)]
public struct Target
{
public int targetID;
public string Label;
}
[DllImport("tyrfde.dll", EntryPoint = "tyrfdeGetTarget")]
public static extern int GetTarget(ref Target[] targets);
내가 DLL의 헤더 파일에서 가지고있는 정보입니다 int. 여기에 몇 가지 검색 후 내가 고치려고했다.
[StructLayout(LayoutKind.Sequential, Size = 260), Serializable]
public struct Target
{
public int targetID;
[MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 256)]
public string Label;
}
[DllImport("tyrfde.dll", EntryPoint = "tyrfdeGetTargets")]
public static extern int GetTarget(ref Target[] targets);
하지만 여전히 문제가 있습니다. 함수가 CLR에서 사용하는 메모리의 일부를 지우는 경우이 예외가 throw 될 수 있음을 읽었습니다. 불행히도 나는 그것을 확인할 수 없다. 분명히 잘못되어 문제를 일으킬 수있는 코드가 있나요?
실제로 배열을 할당하고 함수를 호출하는 예제도 게시해야합니다. 문제가있을 수 있습니다. 함수가'N '요소에 대한 포인터를 받아들이면 배열의 요소 수가 두 번째 매개 변수로 필요하지 않다는 것이 이상하게 보입니다. – arul