2017-05-10 8 views
1

Monodevelop를 사용하고 있으며 C로 작성된 공유 객체 파일을 호출하는 C# 주 프로그램이 있습니다. 솔루션을 성공적으로 빌드하지만 실행하려고하면 위의 System.DllNotfoundException 및 치명적으로 처리되지 않은 예외가 모두 같은 공유 오브젝트 파일.System.DllNotFoundException - SO 파일을 어떻게 가져 옵니까?

나는 다음과 같은 살펴 보았다 : - : https://www.cyberciti.biz/faq/linux-setting-changing-library-path/

의 ldconfig -v의 출력을 보여줍니다 -이 Calling UNIX and Linux \t shared object file \t .so from c# http://mono.1490590.n4.nabble.com/Adding-libraries-to-monodevelop-td1500573.html http://www.mono-project.com/docs/advanced/pinvoke/dllnotfoundexception/ http://www.mono-project.com/docs/advanced/pinvoke/

및 SO 여기에 당 파일의 경로를 설정 올바른 폴더는 있지만 .SO 파일은 아닙니다. 링크 중 하나는 SO 파일의 이름이 무엇인지는 중요하지 않지만 관련성이있는 경우 광산은 'lib'로 시작하지 않는다고 제안합니다.

이 응용 프로그램은 이전에 회사에서 구매했기 때문에 구입했지만, Monodevelop 또는 Linux 플랫폼의 C#에 익숙하지 않았습니다.

프로젝트는 정상적으로 빌드되지만 SO 파일을 찾을 수 없으므로 실행되지 않습니다.

또한 SOode 파일을 Monodevelop의 솔루션에 포함시키고 Build Action 옵션에서 EmbeddedResource로 설정했습니다. 이것이 필요하거나 맞는지 확실하지 않습니다.

C# 코드는 호출 -

[DllImport("xxxxxx.so")] 
protected static extern Int32 xxxxxx_init(); 

모든 SO 파일 같은 관련된 몇 가지 더 전화가있다.

는 어떤 도움을 기꺼이

UPDATE 6 월 12 일 J

항상 :) 받은 : - 그래서, 나는 로그 파일을 통해 보면서 문제의 전체 힙을했습니다. .SO 파일을 찾을 수 없으므로 LDCONFIG를 관련 디렉토리로 업데이트했습니다.

도움이되었지만 .SO 파일을 찾는 데 도움이되었습니다. 원래의 .SO 파일은 32 비트로 만들어졌고 Monodevelop의 64 비트 버전이므로로드되지 않습니다.

Monodevelop에서 C# 코드를 컴파일하여 32 비트 실행 파일을 만들 수있는 방법이 있습니까? 아니면 공유 객체 파일을 64 비트 버전으로 다시 컴파일해야합니까? (내가 웹에서 찾은 정보에서 내 의심은 후자이지만 나도 희망이있다!)

답변

0

면책 조항 : 나는 Mono를 전혀 경험하지 못했다.

.so 자체에 몇 가지 종속성이 있는지 확인해 볼 수 있습니다. here에서

은 (난 당신이 링크를 언급 한 것을 본 적이 있지만, 로그 레벨 또는 확인 종속성에 대한 아무 말도하지 않았다) : 사용하는 경우

호출/

기본 종속성 및 P를 P/Invoke를 통한 네이티브 라이브러리 라이브러리를 찾을 수 없을 때 비슷한 오류가 나타날 수 있습니다.네이티브 라이브러리 이로드되면 기본 라이브러리는 에 다른 라이브러리를로드하려고 시도 할 수 있습니다. 모든 오류는 DllNotFoundException으로 나타나며 원래의 라이브러리가로드되지 않았 음을 나타냅니다. 따라서 라이브러리가있는 동안 하나는 DllNotFoundException으로 끝날 수 있습니다. 이 문제를 해결

디버그 로그 수준 설정을 수행 할 수 있습니다 : 내가 아는 것은 아니지만,

$ MONO_LOG_LEVEL=debug mono YourApp.exe 
<snip> 
Mono-INFO: DllImport error loading library: 'Interop.so': '/usr/lib/Interop.so: undefined symbol: __some_function 
<snip> 
+0

흥미롭게도, 디버그가 application.exe.so가 발견되지 않는 것을 주장되어 하나가 있었다 . System.Windows.Forms.dll이 .so (System.Windows.Forms.dll.so)로 표시 되기는하지만 System.Windows.Forms.dll과 너무 흡사합니다. 참조 파일 중 일부가있는 것처럼 보입니다. 제대로 포함되지 않았습니다. – Jason

+0

@ Jason 연결된 Mono 문서에는 단락이 있다고 생각합니다. '.so'를 찾기위한 표준 위치를 포함하지 않는 것에 관한 것. 아니면'.dll' <->'.so' 매핑이 깨졌습니다. 죄송합니다. 내가있는 곳에서 놀 수는 없습니다. (리눅스도 모노도 없습니다) –

+1

내가 놓친 부분이나 놓친 부분이 있는지, 잘못 설정했는지 확인합니다. – Jason