2016-07-25 2 views
2

몇 가지 내보내기 가능한 함수를 사용하여 C# dll을 만들려고합니다. 그런 다음 C++/관리되지 않는 프로그램에서 해당 .dll을로드하고 dll에서 특정 내 보낸 함수를 호출해야합니다.C# DLL - 내보내기 함수

저는 Robert Giesecke's Unmanaged Exports을 사용합니다. 그러나 그것은 효과가없는 것처럼 보입니다.

나는 디버거에서 관리되지 않는 프로그램을 실행하고 성공적 "을 LoadLibrary()"을 수행하지만 "GetProcAddress를 (test_start)" 하려고 할 때는 호출이 실패하고 0을 반환합니다.

이 내 C# 코드입니다 :

using System.Runtime.InteropServices; 
    using RGiesecke.DllExport; 
    using etc...; 

    namespace test_dll 
    { 

     public class Class1 
     { 

       [DllImport("kernel32.dll")] 
       public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); 

       [DllExport("test_start", CallingConvention = CallingConvention.Cdecl)] 
       public static void test_start() 
       { 
        MessageBox.Show("It works","YES"); 
       } 

     } 
    } 

.DLL 잘 구축 및 CPU 일치 (86),하지만 C#을 DLL을 한 번 내보내기 기능 주소를 얻을 수없는 관리되지 않는 프로그램이로드되었습니다.

지금은 꽤 기본이지만 지금은 작동 시키려고합니다. 나중에 수입이 필요할거야.

아무 도움이라면, 너겟 패키지 설명서가 상당히 얇습니다. 고마워요

+0

'GetProcAddress '호출이 실패한 후'GetLastError'는 무엇을 반환합니까? 올바른 모듈 핸들을'GetProcAddress'에 전달하고 있다고 가정합니다. 생성 된 dll의 EXPORTS 섹션에서'test_start'의 철자 (대소 문자 포함)가 예상 한 것을 확인 했습니까? –

+2

'DllExport'는 내가 들었던 것에서 항상 매우 까다로운 해결책이었습니다. 더 나은 해결책은 C++/cli를 사용하여 관리되는 코드와 연결 해제 된 코드 사이의 다리 역할을하는 것입니다. 그런 다음 unmanged 함수를 노출 한 다음 C#의 관리되는 함수에 호출을 전달합니다. [이 MSDN 블로그 게시물] (https://blogs.msdn.microsoft.com/soultech/2010/07/27/the-bridge-a-pattern-to-leverage-managed-c-code-from-an- unmanaged-c-code-base /)가 어떻게 수행되는지 예를 보여줍니다. –

+0

@ Scott의 권장 사항 외에도 라이브러리를 COM 서버로 빌드하고 클래스를 COM 개체로 내보내는 것이 좋습니다. 조금 더 무겁지만보다 보편적 인 솔루션을 제공합니다 (즉, COM 서버는 다양한 클라이언트 코드 시나리오에서 작동합니다). 현재 문제를 디버깅하려면 dumpbin.exe를/exports 옵션과 함께 사용하여 타사'DllExport' 및 빌드 조치가 내 보낸 내용과 그 내용을 확인할 수 있습니다. –

답변

1

안녕하세요, 실제로 저는 완벽하게 잘하고있었습니다.

이상한 Robert Giesecke의 Unmanaged Exports는 첫 번째 내보내기를 무시합니까 ??

그래서 내가 만든 수출품이 효과가 있었고 인식되었습니다.

나는 유효한 수출품을보기 위하여 CFF 탐험가와 검사하고, 첫번째 것 이외에 모두는 거기에 있었다. 그래서 나는 빈 위에 수출품을 남겼다.