델파이 프로그램에서 호출 할 수있는 .Net에서 관리되지 않는 DLL을 만들어야하는 상황이 있습니다. 나는 약간의 연구를 해왔고 Robert Giesecke의 도서관 (RGiesecke.DllExport)을 발견했습니다. 이 잘 작동여러 프로젝트가 관련된 경우 관리되지 않는 내보내기 (Robert Giesecke)
[ComVisible(true)]
[DllExport("PlaceOrder", CallingConvention = CallingConvention.StdCall)]
public static IntPtr PlaceOrder(IntPtr lnpInXml)
{
string inputXml = Marshal.PtrToStringAnsi(lnpInXml);
StringBuilder sbOutputXml = new StringBuilder();
Form1 pti = new Form1(inputXml, sbOutputXml);
pti.ShowDialog();
return Marshal.StringToHGlobalAnsi(sbOutputXml.ToString());
}
, I 설치 델파이 프로그램 내 DLL을 호출하고 잘 작동 :이 같은 텍스트 상자, 뭔가 윈도우 폼을 표시하는 매우 간단한 DLL 시작했다. 문제는 내 솔루션의 다른 프로젝트에 대한 참조를 추가하고 해당 프로젝트 내부에 개체의 인스턴스를 만들 때 발생합니다. 그 시점에서, 델파이 프로그램은 내 보낸 함수를 찾을 수 없습니다와 같은 형태를 표시 중지하지만 오류가 발생하지 않습니다 중 하나
using MyCommonCode;
namespace UnmanagedDLLTest
{
[ComVisible(true)]
public static class UnmanagedDLL
{
[ComVisible(true)]
[DllExport("PlaceOrder", CallingConvention = CallingConvention.StdCall)]
public static IntPtr PlaceOrder(IntPtr lnpInXml)
{
string inputXml = Marshal.PtrToStringAnsi(lnpInXml);
StringBuilder sbOutputXml = new StringBuilder();
Form1 pti = new Form1(inputXml, sbOutputXml);
pti.ShowDialog();
MyCommonCode.MyClass mc = new MyCommonCode.MyClass();
return Marshal.StringToHGlobalAnsi(sbOutputXml.ToString());
}
}
}
이 줄 :
MyCommonCode.MyClass MC = 새 MyCommonCode.MyClass();
내 문제의 근원이며, 모든 의견을 다시 언급하자마자 모든 것이 다시 작동합니다. 나는 잠시 동안 구글에서 이와 같은 예제를 찾고 있었지만, 내가 찾은 모든 것은 코드의 첫 번째 부분과 유사하다. 어떤 아이디어가 정말이 시점에서 평가 될 것입니다, 나는 그것이 :(수 없습니다 생각하기 시작하고있다.
감사합니다.
[ComVisible (true)]은 필요하지 않습니다. 이 다른 .dll이 델파이 프로그램이 어셈블리를로드하려고하는 동일한 폴더에 복사되어 있습니까? –
이 시나리오에서는 예외를 무시할 수 없습니다. Delphi 코드는 C# 코드가 충돌 한 이유를 알려주지 않습니다. 확실히 근본적인 문제는 MyClass를 포함하는 DLL을 찾을 수 없다는 것입니다. 그러나 그것은 단지 추측이며, C# 코드 자체 내에서 더 나은 오류 처리에 중점을 둡니다. try/catch 및 일부 방법을 사용하여 예외를 표시하거나 로그에 기록하십시오. Delphi가 COM을 잘 지원하면 [ComVisible] 속성을 사용하여 오류를 미리 진단하고보고 할 수 있습니다. –
아이디어를 주셔서 감사합니다. 그것이 작동을 멈췄을 때의 첫 생각이었습니다. 그래서 모든 DLL을 델파이 프로그램이 초기 dll을 찾고있는 폴더로 옮겼습니다 (여전히 작동하지 않았습니다). 그 메소드에 Nlog를 추가하여 파일에 예외를 저장해 보겠습니다. 그래도 작동하지 않으면 COM을 사용해 보겠습니다. – camendez