2016-12-07 3 views
1

C#에서 C++ 라이브러리의 기능을 복제하려고하는데 그 기능 중 하나는 외부에 일부 기능을 제공 할 수 있다는 것입니다.C# 관리되지 않는 내보내기 MissingMethodException

이제 SetAllAnalog()를 호출하면 아래에서 언급 한 예외가 발생합니다. 이것은 실제로 문제를 해결하는 방법이 아닙니다. 왜냐하면 내가 내보낼 다른 함수에 내부 함수를 래핑 할 수 있기 때문입니다.

내가 왜 이런 일이 벌어지고 있고, 이미 언급 된 문제 이외의 문제를 해결할 수있는 더 좋은 방법이 있는지 알고 싶습니다.

나는 다음 코드를했다 :

[DllExport("OutputAllAnalog", CallingConvention = CallingConvention.StdCall)] 
    public static void OutputAllAnalog(int Data1, int Data2) 
    { 
     if (!_k8055D.Connected || Data1 < 0 || 255 < Data1 || 
           Data2 < 0 || 255 < Data2) return; 

     _k8055D.AnalogOutputChannel[0] = (double)Data1/255 * 5; 
     _k8055D.AnalogOutputChannel[1] = (double)Data2/255 * 5; 
    } 

    [DllExport("SetAllAnalog", CallingConvention = CallingConvention.StdCall)] 
    public static void SetAllAnalog() 
    { 
     OutputAllAnalog(255, 255); //exception 
     test(); //No exception 
    } 

    public static void test() 
    { 

    } 

예외 : 당신이 DllExport의 기능에 대해 서로 다른 이름을 사용하여 시도해 봤어

An unhandled exception of type 'System.MissingMethodException' occurred in K8055Test.exe 

Additional information: Method not found: 'Void K8055Simulation.K8055.OutputAllAnalog(Int32, Int32)'. 

답변

1

함수의 실제 이름 대 ExportName 매개 변수를 속성?

[DllExport("OutputAllAnalog", CallingConvention = CallingConvention.StdCall)] 
public static void OutputAllAnalogImplementation(int Data1, int Data2) 
{ 
    if (!_k8055D.Connected || Data1 < 0 || 255 < Data1 || 
          Data2 < 0 || 255 < Data2) return; 

    _k8055D.AnalogOutputChannel[0] = (double)Data1/255 * 5; 
    _k8055D.AnalogOutputChannel[1] = (double)Data2/255 * 5; 
} 

[DllExport("SetAllAnalog", CallingConvention = CallingConvention.StdCall)] 
public static void SetAllAnalog() 
{ 
    OutputAllAnalogImplementation(255, 255); //Fixed exception?? 
    test(); //No exception 
} 

public static void test() 
{ 

} 

This question 6 년 전 유사한 방법 이름으로 인한 오류를 문서화 : 내가 본 모든 예제는이 방법으로, 예를 시행 하였다.

This answerUnmanagedExports Nuget 패키지로 처리되는 비하인드 스토리를 설명하는 Codeplex article에 연결됩니다.

This answer에는이 주제에 대한 추가 참조 자료가 많이 있습니다.

+0

아직 시도하지는 않았지만 대답이 굉장히 많이 들었습니다. 쉬운 루트로 이동하여 기능을 내보내고 내부 메서드를 호출하는 별도의 메서드가 있습니다. – Encore

관련 문제