문제

I have Windows C#프로그램을 사용하는 C++dll 를 위한 데이터 i/o.나의 목표는 배포하는 응용 프로그램으로 단일 EXE.

무엇을 생성하려면 다음 단계를 실행?

도움이 되었습니까?

해결책

하나의 어셈블리의 배포를 관리하고 관리되지 않는 코드 일요일,월 4,2007

.NET 개발자가 사랑 XCOPY 배포합니다.고 그들이 사랑하는 하나의 어셈블리 요소를 사용합니다.적어도 난 항상 느끼는 좀 불안하는 경우가 사용하는 일부 구성 요소와 기억할 필요가 파일의 목록을 포함한 주요 어셈블리는 그 구성 요소입니다.그래서 때 나는 최근에 개발 관리 코드 구성 요소가 증가와 함께 일부에서 관리되지 않는 코드는 C DLL(thx 마 Heege 한다), 내가 생각하는 방법에 대한 더 쉽게 배포할 수 있도록 지원하는 두 개의 Dll.이러한 경우는 단지 두 가지 어셈블리가 사용할 수 있는 ILmerge 팩에서 그들을 하나의 파일입니다.그러나 이 일을 위해 혼합하는 코드 구성 요소와 관리뿐만 아니라 관리되지 않는 DLLs.

So heres 지를 위한 솔루션:

나는 모든 내용이 포함 Dll 을 나 배포하려는 나의 주요 구성 요소 조립으로 포함된 리소스입니다.다음 설정 클래스를 생성자를 추출하려면 이러한 Dll 을 다음과 같다.클래스 ctor 이라고 그냥 한 번에 사용되지 않도록 그 neglible 오버헤드,나는 생각한다.

namespace MyLib
{
    public class MyClass
    {
        static MyClass()
        {
            ResourceExtractor.ExtractResourceToFile("MyLib.ManagedService.dll", "managedservice.dll");
            ResourceExtractor.ExtractResourceToFile("MyLib.UnmanagedService.dll", "unmanagedservice.dll");
        }

        ...

이 예에서 나는 포함되는 두 개의 Dll 자원으로,하나되는 관리되지 않는 코드 DLL,그리고 하나되고 관리되는 코드 DLL(데모 목적으로),를 표시하는 방법,이 기술은 작품에 대한 두 종류의 코드입니다.

코드를 추출하 Dll 파일을 자신의는 간단하다:

public static class ResourceExtractor
{
    public static void ExtractResourceToFile(string resourceName, string filename)
    {
        if (!System.IO.File.Exists(filename))
            using (System.IO.Stream s = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
                using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Create))
                {
                    byte[] b = new byte[s.Length];
                    s.Read(b, 0, b.Length);
                    fs.Write(b, 0, b.Length);
                }
    }
}

작업으로 관리되는 코드 어셈블리가 이와 같은 평소었습니다.당신이 그것을 참조(여기:ManagedService.dll 에)당신의 주요 구성 요소 프로젝트(여기:MyLib)지만,로컬 복사 속성을 설정하면 false 입니다.또한 당신은 링크 어셈블리에서 기존 항목으로 설정하고 구축 작업을 포함 리소스입니다.

에 대해 관리되지 않는 코드(여기:UnmanagedService.dll)당신은 링크에서 DLL 기존 항목으로 설정하고 구축 작업을 포함 리소스입니다.액세스하는 기능을 사용 DllImport 특성 평소와 같이,예를 들어,

[DllImport("unmanagedservice.dll")] public extern static int Add(int a, int b);

다.로 만드 첫 번째 클래스의 인스턴스와 함께 정 ctor embedded Dll 을 얻을 추출으로 파일을 자신의하고 있으로 사용할 준비가 당신이 그들을 배치하는 경우 별도의 파일이 있습니다.로 쓰기 권한 실행을 위해 디렉토리이 잘 작동해야한다.적어도에 대한 코드 원형 이 방법의 단일 어셈블리에 배포하는 것은 매우 편리합니다.

을 즐길!

http://weblogs.asp.net/ralfw/archive/2007/02/04/single-assembly-deployment-of-managed-and-unmanaged-code.aspx

다른 팁

boxedapp;용을 로드하는 모든 Dll 을 메모리에서.또한,그것은 보인다는 내장할 수도 있습니다.net runtime.Good 을 만들는 정말 독립 실행형 응용 프로그램...

Fody.Costura nuget

  1. 솔루션을 엽->프로젝트>Nuget 패키지 관리
  2. 검색 Fody.Costura
  3. 컴파일 귀하의 프로젝트.

니다.

출처: http://www.manuelmeyer.net/2016/01/net-power-tip-10-merging-assemblies/

을 시도했다 ILMerge? http://research.microsoft.com/~mbarnett/ILMerge.aspx

ILMerge 하는 유틸리티 사용할 수 있습을 병합하는 여러가 있습니다.NET 어셈블리로 하나의 어셈블리입니다.그것은 자유롭게 사용할 수 있는 사용을 위해서,도구 및 유틸리티 페이지에서 Microsoft.NET Framework 개발자 센터도 있습니다.

을 구축하는 경우 C++DLL 과 /clr 국기(모든 또는 부분적으로 C++/CLI),다음은 작업:

ilmerge /out:Composite.exe MyMainApp.exe Utility.dll

그것은 작동하지 않습니다 일반(native)Windows DLL 그러나입니다.

을 마우스 오른쪽 단추로 클릭하는 귀하의 프로젝트를 Visual Studio 프로젝트를 선택 속성->리소->리소스 추가->추가 기존 파일의... 포함하고 아래 코드를 포함하고 있습니다.xaml.cs 또는 동일합니다.

public App()
{
    AppDomain.CurrentDomain.AssemblyResolve +=new ResolveEventHandler(CurrentDomain_AssemblyResolve);
}

System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
    string dllName = args.Name.Contains(',') ? args.Name.Substring(0, args.Name.IndexOf(',')) : args.Name.Replace(".dll","");

    dllName = dllName.Replace(".", "_");

    if (dllName.EndsWith("_resources")) return null;

    System.Resources.ResourceManager rm = new System.Resources.ResourceManager(GetType().Namespace + ".Properties.Resources", System.Reflection.Assembly.GetExecutingAssembly());

    byte[] bytes = (byte[])rm.GetObject(dllName);

    return System.Reflection.Assembly.Load(bytes);
}

여기에 내가 원래 블로그 게시물:http://codeblog.larsholm.net/2011/06/embed-dlls-easily-in-a-net-assembly/

Thinstall 은 하나의 솔루션을 제공합니다.에 대한 기본 windows 응용 프로그램이 포함 DLL 로 바이너리 자원 개체에 다음을 추출 그것은 런타임하기 전에 당신은 그것을 필요합니다.

스마트 어셈블리 을 할 수 있습니다.하는 경우 응용 프로그램이 관리되지 않는 코드를 병합 dll 을 하나의 어셈블리,대신 그것을 포함 할 수 있습니다 필요한 종속성으로 자원의 주요 exe.그면,그 무료로하지 않습니다.

이렇게 하려면 수동으로 포함하여 위치를 파악하고 자원이 다음에 의존하는 사용되지 않의 어셈블리 ResolveHandler.올 때는 혼합 모드 dll,여러 개와 맛의 ResolveHandler 접근 방식은 나를 위해 일하지 않을(모든 읽 dll 바이트 메모리에 읽).그들은 모든 일에 대한 관리 dlls.여기에는 무엇이 나를 위해 일했:

static void Main()
{
    AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
    {
        string assemblyName = new AssemblyName(args.Name).Name;
        if (assemblyName.EndsWith(".resources"))
            return null;

        string dllName = assemblyName + ".dll";
        string dllFullPath = Path.Combine(GetMyApplicationSpecificPath(), dllName);

        using (Stream s = Assembly.GetEntryAssembly().GetManifestResourceStream(typeof(Program).Namespace + ".Resources." + dllName))
        {
            byte[] data = new byte[stream.Length];
            s.Read(data, 0, data.Length);

            //or just byte[] data = new BinaryReader(s).ReadBytes((int)s.Length);

            File.WriteAllBytes(dllFullPath, data);
        }

        return Assembly.LoadFrom(dllFullPath);
    };
}

여기에 키를 쓰는 바이트를 파일에서 부하의 위치에 있습니다.을 방지하는 닭고기와 계란 문제를 확인해야를 선언하고 처리하기 전에 액세스하기 어셈블리고 당신은에 액세스하지 않고 어셈블리 회원(또는 인스턴스화는 아무것도 처리는 어셈블리)안쪽에 선적(어셈블리를 해결)부분입니다.또한 돌을 보장 GetMyApplicationSpecificPath() 지 temp 디렉토리부터 임시 파일을 수도 얻을 삭제하여 다른 프로그램 또는 직접(하지 않는 것이 삭제되는 동안 프로그램에 액세스하 dll,하지만 적어도 그를 귀찮게 합니다.AppData 은 좋은 위치).또한 사용자가 작성해야 하는 각각의 바이트 시간,당신은에서 부하에 위치'cos dll 이미 있다.

어셈블리를 완전히 관리되지 않는,당신이 볼 수 있 이 링크 을 로드하는 방법은 dlls.

PostBuild 서 Xenocode 패키지할 수 있습까지 모두 관리되고 관리되지 않으로 단일 exe.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top