몇 가지 내보내기 가능한 함수를 사용하여 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을 한 번 내보내기 기능 주소를 얻을 수없는 관리되지 않는 프로그램이로드되었습니다.
지금은 꽤 기본이지만 지금은 작동 시키려고합니다. 나중에 수입이 필요할거야.
아무 도움이라면, 너겟 패키지 설명서가 상당히 얇습니다. 고마워요
'GetProcAddress '호출이 실패한 후'GetLastError'는 무엇을 반환합니까? 올바른 모듈 핸들을'GetProcAddress'에 전달하고 있다고 가정합니다. 생성 된 dll의 EXPORTS 섹션에서'test_start'의 철자 (대소 문자 포함)가 예상 한 것을 확인 했습니까? –
'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 /)가 어떻게 수행되는지 예를 보여줍니다. –
@ Scott의 권장 사항 외에도 라이브러리를 COM 서버로 빌드하고 클래스를 COM 개체로 내보내는 것이 좋습니다. 조금 더 무겁지만보다 보편적 인 솔루션을 제공합니다 (즉, COM 서버는 다양한 클라이언트 코드 시나리오에서 작동합니다). 현재 문제를 디버깅하려면 dumpbin.exe를/exports 옵션과 함께 사용하여 타사'DllExport' 및 빌드 조치가 내 보낸 내용과 그 내용을 확인할 수 있습니다. –