2013-04-25 4 views
3

RGiesecke DLLExport 라이브러리를 사용하여 VC6 기반의 레거시 응용 프로그램에서 동적으로로드 할 수있는 C# DLL을 생성하고 있습니다. 그것은 메서드를 내 보냈고 VC6 코드에서 호출되었습니다. 아무 문제 없습니다. 그러나, 내 .net 클래스 중 하나의 변수를 선언하려고 시도하는 한 추락했습니다.관리되지 않는 내보내기 (DLLExport) 충돌이 발생합니다.

//I tried CallingConvention = CallingConvention.StdCall too 
    [DllExport(CallingConvention = CallingConvention.Winapi)] 
    static void GetDwgReferences(string fileName) 
    { 
     //OK: inialize System classes of .net 
     DateTime dateTime = DateTime.Now; 

     //crashing here: declare a variable of my static class (.net assemebly) 
     //SafeString safeString; 

     //crashing here: declare a variable of my class (.net assemebly) 
     //Email email; 

     //crashing here: initialize an object of my class (.net assemebly) 
     //DwgXrefs dwgXrefs = new DwgXrefs(); 

     //crashing here by declcare a variable of third-party library (.net assemebly) 
     //ExSystemServices _serv; 
    } 

무엇이 잘못 되었습니까? 도와주세요.

답변

2

관리 대상 dll을로드하기 위해 Metatrader에서 관리되지 않는 내보내기를 사용하려고해도 비슷한 문제가있었습니다.

일부 파기 후에 나는 문제를 발견했다고 생각합니다. 응용 프로그램 도메인은 아마 당신이 기대하는 곳이 아니며, CLR은 어셈블리를 해결하려고하지만 말로 표현할 수없는 오류로 실패합니다. 내 경우에는 앱 도메인이 실제로 호스트 응용 프로그램의 디렉토리에서 실행 중이므로 항상 그렇다고 가정합니다.

내가 제안 당신은 다음과 같은 뭔가 베어없는 종속 DLL, 장소를 구축하면된다 :

static void Initialize() 
{ 
     SimpleLog.WriteLog("App -" + AppDomain.CurrentDomain.BaseDirectory); 
} 

[DllExport("Test", CallingConvention = CallingConvention.StdCall)] 
public static void Test() 
{ 
    Initialize(); 
} 

나는 확실하지 않다하지만 난 당신이 가능하게 여기 정적 생성자를 사용할 수 없습니다 생각 ?

로그에 해당 도메인의 실행 디렉터리가 표시되어야합니다. 어셈블리를 여기에두면 잘 작동합니다. 여기에 문제가 해결되었습니다. 다음 질문은 우리가 런타임에이 어셈블리를 여기에 넣고 싶지 않을 때 도메인을 변경할 수 있는가하는 것입니다.

간단한 로거의 소스 코드가 필요하면 google을 사용하십시오. 분명히 dll 의존성이있는 타사 로깅 프레임 워크를 사용하지 마십시오!

내가 내이 하나의 적응 생각 : http://www.codeproject.com/Articles/80175/Really-Simple-Log-Writer

0

다른 대답이 언급 한 바와 같이, C#을 명시 적으로 각 메소드 내에서 try/catch 블록에서 오류를 잡는없이 던지고 어떤 오류 알고 어렵다 C# DLL의.

[DllExport(CallingConvention = CallingConvention.StdCall)] 
static void GetDwgReferences([MarshalAs(UnmanagedType.LPWStr)] string fileName) 
{ 
} 

관리되지 않는 수출은 수출을 위해 로버트 대해서 Giesecke의 C# 프로젝트 템플릿을 사용하여 작업, 예를 들어 Code to Export C# DLL to Metatrader Build 600+를 참조하십시오

당신은 가능성이 CallingConvention.StdCall로 수출하고 추가로 관리되지 않는 LPWSTR 유형으로 들어오는 문자열을 마샬링 할 필요가 C# dll에서 레거시 응용 프로그램 (MT4)

또한 대부분 .NET 내에서 원시 코드에 액세스하는 데 도움이되지만 Native and .NET Interopability이 재미있을 수도 있습니다.