为什么在我的项目中引用dll文件后,当我构建项目时,它们不在我的发布目录中?

时间:2015-01-20 10:16:42

标签: c# .net winforms dll directx

当我的兄弟正在运行该程序时,他会异常地说找不到一个或多个dll文件。

我向他发送了3个dll文件,他试图将它们放在他运行程序的地方,他也试图将它们放在他们所在的目录中:

  

C:\ TEMP \的DLL \ DLL'S \ Microsoft.DirectX.DLL

他创建了这个目录并将它们放在那里,但它没有帮助。

我确信一旦我引用了他们在我的程序中的dll文件就不需要了。至少要将它们放在运行程序的目录中,但它不起作用。

我想要的是我的兄弟和任何其他将运行程序的人都不需要他的电脑上的dll文件,如果他确实需要它们,那么将它们放在你运行程序的目录中就足够了。我该如何解决?

我的兄弟也尝试将dll放在他运行程序的地方。

3个dll文件是:

Microsoft.DirectX.Direct3D.DLL, Microsoft.DirectX.Direct3DX.DLL, Microsoft.DirectX.DLL

问题是为什么他会得到这个例外?真的,它看到/找到DLL文件?或者他的机器可能不支持这个directx文件?奇怪。

另外一件事,当我把鼠标放在dll文件的硬盘上时,我看到一个气球提示说:

文件描述:Microsoft Managed Direct3D Debug

也许问题是directx的dll文件属于debug目录但是我的程序是在发布目录中构建的?

无论如何我还找不到任何解决方案。这是异常消息:

    System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.DirectX.Direct3DX.dll' or one of its dependencies. The specified module could not be found.
File name: 'Microsoft.DirectX.Direct3DX.dll'
   at mws.ScanningClouds.InitializeDirectX()
   at mws.ScanningClouds.ScanClouds_Load(Object sender, EventArgs e) in d:\C-Sharp\Download File\Downloading-File-Project-Version-012\Downloading File\ScanningClouds.cs:line 142
   at System.Windows.Forms.Form.OnLoad(EventArgs e)
   at System.Windows.Forms.Form.OnCreateControl()
   at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
   at System.Windows.Forms.Control.CreateControl()
   at System.Windows.Forms.Control.WmShowWindow(Message& m)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ScrollableControl.WndProc(Message& m)
   at System.Windows.Forms.ContainerControl.WndProc(Message& m)
   at System.Windows.Forms.Form.WmShowWindow(Message& m)
   at System.Windows.Forms.Form.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

这是发生异常的行的代码142:

private void ScanClouds_Load(object sender, EventArgs e)
        {
            Boolean bl = InitializeDirectX();

            if (bl == false)
            {
                MessageBox.Show("Error initializing directX!");
                Application.Exit();
            }
        }

该行是:Boolean bl = InitializeDirectX(); 方法:InitializeDirectX()

private Boolean InitializeDirectX()
        {
            DispMode = Manager.Adapters[Manager.Adapters.Default.Adapter].CurrentDisplayMode;
            D3Dpp = new PresentParameters();
            D3Dpp.BackBufferFormat = DispMode.Format;
            D3Dpp.PresentFlag = PresentFlag.LockableBackBuffer;

            D3Dpp.SwapEffect = SwapEffect.Discard;
            D3Dpp.PresentationInterval = PresentInterval.One; //wait for vertical sync. Synchronizes the painting with
            //monitor refresh rate for smoooth animation
            D3Dpp.Windowed = true; //the application has borders

            try
            {
                D3Ddev = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, pictureBox1.Handle,
                                                                           CreateFlags.SoftwareVertexProcessing, D3Dpp);
                D3Ddev.VertexFormat = CustomVertex.PositionColored.Format;
                D3Ddev.RenderState.Lighting = false;
                D3Ddev.RenderState.CullMode = Cull.CounterClockwise;

                //load imagesBmp to panelTexture
                //panelTexture = Texture.FromBitmap(D3Ddev, imagesBmp, Usage.Dynamic, Pool.Default)

                backTexture = TextureLoader.FromStream(D3Ddev, mymem);

                //scannerTexture = TextureLoader.FromFile(D3Ddev, @"D:\Buttons\Radar\radar.png");
                scannedCloudsTexture = new Texture(D3Ddev, 512, 512, 1, Usage.Dynamic, Format.A8R8G8B8, Pool.Default);

                //sprite is used to draw the texture
                D3Dsprite = new Sprite(D3Ddev);

                return true;
            }
            catch
            {
                return false;
            }
        }

1 个答案:

答案 0 :(得分:-1)

告诉你的兄弟安装DX SDK或Windows 8上的Windows SDK。 此程序集不属于您的应用程序文件夹,它是围绕Windows API构建的一组库的一部分,这些程序集与其他文件有一组复杂的关系,可以在您的PC上运行DX。 / p> 编辑:因为没有考虑到这个答案,所以#34;足够好"我以为我会详细说明......

所需的文件是您的代码所依赖的深度依赖链的一部分,通过向您的解决方案添加安装程序项目并构建Windows安装框架将突出显示缺少的内容并提示您的兄弟安装正确的部件安装DX应用程序时。

在说出像#34这样的东西之后应该自动安装这个东西;这个东西取决于没有安装的foo,你想现在安装吗?"

假设你的兄弟回答是......问题解决了!

要么,我的原始答案代表,安装SDK很可能会解决问题,而且现在大多数玩家都将它安装在他们的电脑上。